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

Đề tài: chuyển đổi biểu thức từ dạng trung tố sang hậu tố bằng stack

  1. #1
    Ngày gia nhập
    04 2012
    Bài viết
    2

    Red face chuyển đổi biểu thức từ dạng trung tố sang hậu tố bằng stack

    Ai có code bài chuyển đổi biểu thức từ dạng trung tố sang hậu tố bằng stack dùng ngôn ngữ C hoặc C++ thì share cho mình với. Cám ơn rất nhìu

  2. #2
    Ngày gia nhập
    04 2010
    Nơi ở
    Binh Thanh, Hồ Chí Minh, Vietnam, Vietnam
    Bài viết
    504

    Chôm từ:... không nhớ rõ hình như là MSDN
    C++ Code:
    1. #include <iostream>
    2. #include <string>
    3. #include <stack>
    4. #include <ctype>   // to use the tolower function
    5.  
    6. using namespace std;
    7.  
    8. void Convert(const string & Infix, string & Postfix);
    9. bool IsOperand(char ch);
    10. bool TakesPrecedence(char OperatorA, char OperatorB);
    11.  
    12.  
    13. int main(void)
    14. {
    15.     char Reply;
    16.     do
    17.     {
    18.         string Infix, Postfix;   // local to this loop
    19.  
    20.         cout << "Enter an infix exp<b></b>ression (e.g. (a+B)/c^2, with no spaces):" << endl;
    21.         cin >> Infix;
    22.  
    23.         Convert(Infix, Postfix);
    24.  
    25.         cout << "The equivalent postfix exp<b></b>ression is:" << endl;
    26.         cout << Postfix << endl;
    27.         cout << endl << "Do another (y/n)? ";
    28.        
    29.         cin >> Reply;
    30.     }
    31.     while (tolower(Reply) == 'y');
    32.  
    33.     return 0;
    34. }
    35.  
    36.  
    37. /* Given:  ch   A character.
    38.    Task:   To determine whether ch represents an operand (here understood
    39.            to be a single letter or digit).
    40.    Return: In the function name: true, if ch is an operand, false otherwise.
    41. */
    42. inline bool IsOperand(char ch)
    43. {
    44.     return ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9'));
    45. }
    46.  
    47. /* Given:  OperatorA    A character representing an operator or parenthesis.
    48.            OperatorB    A character representing an operator or parenthesis.
    49.    Task:   To determine whether OperatorA takes precedence over OperatorB.
    50.    Return: In the function name: true, if OperatorA takes precedence over
    51.            OperatorB.
    52. */
    53. bool TakesPrecedence(char OperatorA, char OperatorB)
    54. {
    55.     if (OperatorA == '(')
    56.         return false;
    57.     else if (OperatorB == '(')
    58.         return false;
    59.     else if (OperatorB == ')')
    60.         return true;
    61.     else if ((OperatorA == '^') && (OperatorB == '^'))
    62.         return false;
    63.     else if (OperatorA == '^')
    64.         return true;
    65.     else if (OperatorB == '^')
    66.         return false;
    67.     else if ((OperatorA == '*') || (OperatorA == '/'))
    68.         return true;
    69.     else if ((OperatorB == '*') || (OperatorB == '/'))
    70.         return false;
    71.     else
    72.         return true;
    73. }
    74.  
    75.  
    76. /* Given:  Infix    A string representing an infix exp<b></b>ression (no spaces).
    77.    Task:   To find the postfix equivalent of this exp<b></b>ression.
    78.    Return: Postfix  A string holding this postfix equivalent.
    79. */
    80. // (5 + 6) * 11 - 50 = 5 6 + 11 * 50 -
    81. void Convert(const string & Infix, string & Postfix)
    82. {
    83.     stack<char> OperatorStack;
    84.     char TopSymbol, Symbol;
    85.     int k;
    86.  
    87.     for (k = 0; k < Infix.size(); k++)
    88.     {
    89.         Symbol = Infix[k];
    90.         if (IsOperand(Symbol))
    91.             Postfix = Postfix + Symbol;
    92.         else
    93.         {
    94.             while (!OperatorStack.empty() && TakesPrecedence(OperatorStack.top(), Symbol))
    95.             {
    96.                 TopSymbol = OperatorStack.top();
    97.                 OperatorStack.pop();
    98.                 Postfix = Postfix + TopSymbol;
    99.             }
    100.             if (!OperatorStack.empty() && Symbol == ')')
    101.                 OperatorStack.pop();   // discard matching (
    102.             else
    103.                 OperatorStack.push(Symbol);
    104.         }
    105.     }
    106.     while (!OperatorStack.empty())
    107.     {
    108.         TopSymbol = OperatorStack.top();
    109.         OperatorStack.pop();
    110.         Postfix = Postfix + TopSymbol;
    111.     }
    112. }
    Đoạn code này nó gặp một vài lỗi nhỏ về số do xử ký theo kiểu kí tự. Ví dụ:
    (5 + 60) * 11 - 50 Nó sẽ cho ra: 560+11*50- bạn sẽ không biết được 560 là số nào 56 0 hay 5 60, bởi vậy phải chuyển thành số trước khi cho vào stack. Ok?
    Kết bạn với tôi <3
    Skype: giautm
    Facebook:
    https://fb.com/giautm.duongntt
    Email:
    giau.tmg@gmail.com

  3. #3
    Ngày gia nhập
    04 2012
    Bài viết
    2

    hi, cám ơn bạn nha

  4. #4
    Ngày gia nhập
    11 2011
    Bài viết
    11

    Mặc định minh code ntn ai xem thử sai ở đâu nhé

    C++ Code:
    1. #include<iostream.h>
    2. #include<conio.h>
    3. struct NUT
    4. { int DATA;
    5.    NUT*next,*prev;
    6.  
    7. };
    8. typedef NUT*TRO;
    9.  void PUSH(int x,TRO &First,TRO&Last)
    10.   {TRO p=new(NUT);
    11.    p->DATA=x;
    12.    p->next=NULL;
    13.    p->prev=NULL;
    14.    if(Last==NULL)
    15.    {
    16.      First=Last=p;
    17.     }
    18.     else
    19.     { p->prev=Last;
    20.       Last->next=p;
    21.       Last=p;
    22.  
    23.     }
    24.  
    25.     }
    26.  
    27.  
    28.   void  xemds(TRO Last)
    29.   {TRO p=Last;
    30.    while (Last)
    31.    {cout<<" "<<p->DATA;
    32.     p=p->prev;
    33.    }
    34.    cout<<endl;
    35.   }
    36.  
    37. int POP(TRO&Last)
    38. {TRO p=Last;
    39.   int x=p->DATA;
    40.   Last=Last->prev;
    41.   Last->next=p;
    42.   delete(p);
    43.   return x;
    44. }
    45. void bin(int n)
    46. {TRO First=NULL;
    47.  TRO Last=NULL;
    48.  while(n>0)
    49.  {PUSH(n%2,First,Last);
    50.   n=n/2;
    51.  }
    52.  while(Last)
    53. { cout<<POP(Last);
    54. }
    55. }
    56. void main()
    57. {clrscr();
    58.  TRO First,Last;
    59.  
    60.  bin(12);
    61.  xemds(Last);
    62.  getch();
    63. }

  5. #5
    Ngày gia nhập
    10 2011
    Bài viết
    552

    Cái cậu thanhbaton đấy bị làm sao thế ?
    Tự dưng topic của người ta, chen ngang hỏi bài chả liên quan ?
    Um Mani Padme Hum...!!

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

  1. code bài chuyển biểu thức từ trung sang hậu tố-Dùng Stack
    Gửi bởi Loveanygirls trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 6
    Bài viết cuối: 16-02-2012, 02:48 PM
  2. Cấu trúc dữ liệu Chuyển các phần tử từ stack này sang stack kia như thế nào?
    Gửi bởi rukawa1184 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 9
    Bài viết cuối: 06-12-2011, 06:52 PM
  3. Bị lỗi biên dịch khi sử dụng stack trong việc chuyển trung tố sang hậu tố
    Gửi bởi kuhoang0512 trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 16
    Bài viết cuối: 05-11-2011, 01:17 AM
  4. Help:dùng stack chuyển biểu thức từ trung sang hậu tố
    Gửi bởi nike trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 0
    Bài viết cuối: 23-11-2010, 10:20 PM
  5. Dùng stack, chuyển trung tố sang hậu tố bị lỗi. Đề tài niên luận của tớ.
    Gửi bởi Loveanygirls trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 13
    Bài viết cuối: 15-11-2010, 10:17 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