Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Áp dụng Stack tính biểu thức trong C++, cần giúp đỡ

  1. #1
    Ngày gia nhập
    02 2008
    Nơi ở
    Việt Nam
    Bài viết
    577

    Mặc định Áp dụng Stack tính biểu thức trong C++, cần giúp đỡ

    Để làm bài này mình chia làm 3 phần (đầu bài trong code), mình đang làm giở mới được 2 phần, tuy nhiên test thử thấy nó bị lỗi don't send windows mọi người xem dùm.

    C++ Code:
    1. /*Chuong trinh tinh gia tri bieu thuc nhap vao, su dung stack
    2.  - Kiem tra tinh dung dan bieu thuc: so ngoac mo tuong ung so ngoac dong
    3.  - Chuyen bieu thuc tu trung to (infix) thanh dang hau to (postfix)
    4.  - Dung thuat toan Ba lan cai dat stack tinh gia tri bieu thuc
    5. */
    6. #include <iostream>
    7. #include <string.h>
    8. using namespace std;
    9.  
    10.  
    11. typedef struct node
    12. {
    13.     char info;
    14.     node* next;
    15. };
    16.  
    17. typedef struct node* NODEPTR;
    18.  
    19.  
    20.  
    21. /*Cai dat stack*/
    22. void initialize(NODEPTR &plist)
    23. {
    24.     plist=NULL;
    25. }
    26.  
    27. int empty(NODEPTR plist)
    28. {
    29.     if (plist==NULL) return 1;
    30.     return 0;
    31. }
    32.  
    33. void push(NODEPTR &plist, char x)
    34. {
    35.     NODEPTR p;
    36.     p = new struct node;
    37.     p->info=x;
    38.     if (empty(plist))
    39.     {
    40.         p->next=NULL;
    41.         plist=p;
    42.     }
    43.     else
    44.     {
    45.         p->next=plist;
    46.         plist=p;
    47.     }
    48. }
    49.  
    50. NODEPTR pop(NODEPTR &plist)
    51. {
    52.     NODEPTR p=NULL;
    53.     if (empty(plist)) return p;
    54.     else
    55.     {
    56.         p=plist;
    57.         plist=plist->next;
    58.     }
    59.     return p;
    60. }
    61.  
    62. void ClearStack(NODEPTR &plist)
    63. {
    64.     NODEPTR p;
    65.     while (plist != NULL)
    66.     {
    67.         p=plist;
    68.         plist=plist->next;
    69.         delete p;
    70.     }
    71.     initialize(plist);
    72. }
    73.  
    74. /*Kiem tra tuong ung ngoac dong - mo*/
    75. bool TestBracket(char x, char y)
    76. {
    77.     if (x=='(' && y==')') return true;
    78.     if (x=='[' && y==']') return true;
    79.     if (x=='{' && y=='}') return true;
    80.     return false;
    81. }
    82.  
    83. bool Test(NODEPTR plist, string s)
    84. {
    85.     ClearStack(plist);
    86.     int i=0,n=s.length();
    87.     while ( i<n )
    88.     {
    89.         if (s[i]=='(' || s[i]=='[' || s[i]=='{')
    90.             push(plist, s[i]);
    91.         else if (s[i]==')' || s[i]==']' || s[i]=='}')
    92.         {
    93.             NODEPTR p=pop(plist);
    94.             if (!TestBracket(p->info,s[i])) {delete p;return false;}
    95.             delete p;
    96.         }
    97.         i++;
    98.     }
    99.     if (!empty(plist))  return false;
    100.     return true;
    101. }
    102.  
    103. /* Chuyen infix -> postfix*/
    104. bool IsBracket(char x)
    105. {
    106.     char a[]={'(' , '[' , '{' , ')' , ']' , '}'};
    107.     for (int i=0; i<6; ++i)
    108.     {
    109.         if (x==a[i]) return true;
    110.     }
    111.     return false;
    112. }
    113.  
    114. bool IsOperator(char x)
    115. {
    116.     char a[]={'+' , '-' , '*' , '/'};
    117.     for (int i=0; i<4; ++i)
    118.     {
    119.         if (x==a[i]) return true;
    120.     }
    121.     return false;
    122. }
    123.  
    124. int rank(char x)
    125. {
    126.     if (x=='(' || x=='[' || x=='{' ) return 1;
    127.     else if (x=='+' || x=='-') return 2;
    128.     else if (x=='*' || x=='/') return 3;
    129.     else return 0;
    130. }
    131.  
    132. string convert(string s,NODEPTR plist)
    133. {
    134.     ClearStack(plist);
    135.     string st;
    136.     NODEPTR p;
    137.     p = new struct node;
    138.     int i=0,j=0,n=s.length();
    139.     while ( i<n )
    140.     {
    141.         if (!(IsBracket(s[i]) || IsOperator(s[i]))) st+=s[i];
    142.         else if (s[i]=='(' || s[i]=='[' || s[i]=='{') push(plist,s[i]);
    143.         else
    144.         {
    145.             if (empty(plist)) push(plist,s[i]);
    146.             else if (rank(s[i]) > rank(plist->info)) push(plist,s[i]);
    147.             else if (s[i]==')' || s[i]==']' || s[i]=='}')
    148.             {
    149.                 while (IsOperator(plist->info))
    150.                 {
    151.                     if (IsOperator(plist->info)) st+=plist->info;
    152.                     p=pop(plist);
    153.                     delete p;
    154.                 }
    155.                 p=pop(plist);
    156.                 delete p;
    157.             }
    158.             else
    159.             {
    160.                 while (rank(s[i]) <= rank(plist->info))
    161.                 {
    162.                     st+=plist->info;
    163.                     p=pop(plist);
    164.                     delete p;
    165.                 }
    166.                 push(plist,s[i]);
    167.             }
    168.         }
    169.         i++;
    170.     }
    171.     while (plist != NULL)
    172.     {
    173.         p=pop(plist);
    174.         if (IsOperator(p->info)) st+=p->info;
    175.         delete p;
    176.     }
    177.     return st;
    178. }
    179.  
    180. /* MAIN */
    181. int main()
    182. {
    183.     NODEPTR plist=NULL;
    184.     string s,st;
    185.     cout<<" * Enter expression (infix): ";
    186.     getline (cin,s);
    187.     if (Test(plist,s))
    188.     {
    189.         st=convert(s,plist);
    190.         cout<<"\n -> Result (postfix): "<<st<<endl;
    191.     }
    192.     else cout<<"Expression is not mathes."<<endl;
    193.     system("pause");
    194.     return 0;
    195. }

    @edit:
    - Compile Code block,
    - Đã thử trên VC++8 nhưng nhiều lỗi hơn mình không thạo nên khó sửa
    - Mới làm quen thư viện string.h và khai báo chuỗi sử dụng string nên mọi gừi hướng dẫn kĩ dùm phần đó.

    Cảm ơn!
    Đã được chỉnh sửa lần cuối bởi QuangHoang : 18-10-2008 lúc 12:21 PM.

  2. #2
    Ngày gia nhập
    09 2007
    Bài viết
    724

    1 - Mình Test trên VS 2k8 chạy bình thường(Không thấy báo lỗi như bạn nói) nếu bạn sửa lại mấy cái include như sau.

    C++ Code:
    1.  
    2. #include <stdafx.h> // nếu nó la làng thiếu thì include nó vào.
    3. #include <iostream>
    4. #include <string> // cái này bỏ .h đi

    2 - trong STL có thư viện stack rồi bạn có thể dùng lại nó trong các bài như này.
    Nó nằm trong stack.

    C++ Code:
    1. #include <stack>

    khai báo của nó cũng khá đơn giản.
    C++ Code:
    1.  
    2. stack<int> MyStack;
    3. // Lấy một phần tử ra.
    4. int value;
    5. value = (int)Mystack.top(); // lưu ý cái này chỉ lấy ra giá trị chứ nó không xóa đi giá trị.
    6. //đẩy một phần tử vào Stack.
    7. Mystack.push(value);
    8. //Xóa một phần tử ra khỏi Stack.
    9. Mystack.pop();
    10. //Kiểm tra một stack có rỗng hay không!
    11. Mystack.empty(); // nếu nó trả về true thì rỗng, nếu nó trả về false thì không rỗng.


    còn code block mình ko có nên chưa test trên đó cho bạn được


    ps: Chẳng thấy bạn giải phóng bộ nhớ của stack sau khi dùng
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 18-10-2008 lúc 12:53 PM.

  3. #3
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Z giải thích về cái này được không?
    PHP Code:
    #include <stdafx.h> // nếu nó la làng thiếu thì include nó vào. 
    Đọc qua nhưng hiểu về nó lắm
    Cánh Chym ứ mỏi

  4. #4
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    C++ Code:
    1. bool Test(NODEPTR plist, string s)
    2. {
    3.     ClearStack(plist);
    4.     int i=0,n=s.length();
    5.     while ( i<n )
    6.     {
    7.         if (s[i]=='(' || s[i]=='[' || s[i]=='{')
    8.             push(plist, s[i]);
    9.         else if (s[i]==')' || s[i]==']' || s[i]=='}')
    10.         {
    11.             NODEPTR p=pop(plist);
    12.             if (!TestBracket(p->info,s[i])) {delete p;return false;}
    13.             delete p;
    14.         }
    15.         i++;
    16.     }
    17.     if (!empty(plist))  return false;
    18.     return true;
    19. }
    Sao hàm này bỏ cái stack vào rồi lại ClearStack ?
    #include <string.h> = #include <cstring>
    - Code của em dùng C++ string, ( i.e #include <string> )
    - Hàm IsOperator và IsBracket dùng else if nhanh hơn dùng vòng lặp.
    - Idea stack dùng link list sai, client sao có thể dùng Node được. Chỉ internal đụng chạm tới Node được thôi, cái sườn trong là linklist nhưng client làm việc chỉ trên cái Top thôi.
    - Pop mà cản gan cho return pointer !!
    - Viết kĩ lại đi em !

  5. #5
    Ngày gia nhập
    09 2007
    Bài viết
    724

    À ừ thế này: trong VS khi tạo một project thì nó sẽ tạo ra cho chúng ta 2 file 1 là stdafx.h 1 là stdafx.cpp.

    Đây là phần mô tả của stdafx.h
    PHP Code:
    // stdafx.h : include file for standard system include files,
    // or project specific include files that are used frequently, but
    // are changed infrequently
    // 
    Nếu có cái thư viện nào mà có nhu cầu dùng cho toàn bộ project thì quăng hết vào đây! ở những chổ khác thì chỉ cần "in cái lẫu dê" thằng này vào thôi. khỏi cần loằng ngoằng các thằng khác nữa.

  6. #6
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Mặc định Áp dụng Stack tính biểu thức trong C++, cần giúp đỡ

    Hồi đó có đọc 1 sách, giờ thì r2 chưa có thời gian lục lại, nhưng gom hết các header bỏ vào 1 file tăng performance. Trong standard C++ thì chỉ cần tại 1 file ví dụ #include "std.h".
    Bỏ tất cả vào đây là xong !

  7. #7
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Trích dẫn Nguyên bản được gửi bởi rox_rook Xem bài viết
    Hồi đó có đọc 1 sách, giờ thì r2 chưa có thời gian lục lại, nhưng gom hết các header bỏ vào 1 file tăng performance. Trong standard C++ thì chỉ cần tại 1 file ví dụ #include "std.h".
    Bỏ tất cả vào đây là xong !
    Uh. thì bên VC nó tạo sẵn ra cho mình đó là file stdafx.h đó .
    cái này chỉ cho chúng ta được một cái là dễ quản lý các file mà mình include vào thôi.

Các đề tài tương tự

  1. Lỗi không pop được các giá trị trong 1 đoạn code cộng 2 số lớn dùng stack. Giúp mình sửa với?
    Gửi bởi QUOC HUNG trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 3
    Bài viết cuối: 03-11-2011, 09:10 PM
  2. Stack, ngăn xếp - Thiết lập và ứng dụng stack trong C
    Gửi bởi PoPoPoPo trong diễn đàn Thủ thuật, Tutorials CTDL & Giải thuật
    Trả lời: 8
    Bài viết cuối: 15-11-2010, 11:24 PM
  3. Code xây dựng mảng stack trong C++. Mọi người xem và khắc phục các vấn đề giúp mình?
    Gửi bởi jb_hoangluan trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 10
    Bài viết cuối: 27-07-2010, 04:43 PM
  4. in ra số lẻ trong stack. cần giúp đỡ
    Gửi bởi duy tdt trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 24-06-2010, 02:12 PM
  5. Bài tập C++ In tất cả các số chẵn trong stack. Giúp đỡ?
    Gửi bởi Intel trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 5
    Bài viết cuối: 05-03-2010, 09:28 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn