1368 表达式转换

来源:互联网 发布:wifi提示无法加入网络 编辑:程序博客网 时间:2024/04/29 22:53
 
描述

把中缀表达式转化为后缀表达式……

书上有详细讲解.

输入

第一行为T,表示有T组数据;

以下T行每行包含一个字符串,是中缀表达式。

输出

对于每组测试数据数据后缀表达式。

样例输入
1
A+(B-C/D)*E
样例输出
ABCD/-E*+

 

 

经典问题,用栈实现

#include   <iostream>     #include   <string>     #include   <stack>         using   namespace   std;             void   Convert(const   string   &   Infix,   string   &   Postfix);         bool   IsOperand(char   ch);         bool   TakesPrecedence(char   OperatorA,   char   OperatorB);             int   main(void)           {           char   Reply;          int number;        scanf("%d",&number);       while(number--)                    {                 string   Infix,   Postfix;       //   local   to   this   loop                                  cin   >>   Infix;                     Convert(Infix,   Postfix);                                  cout  <<   Postfix   <<   endl;                             }                      return   0;           }             /*   Given:     ch       A   character.           Task:       To   determine   whether   ch   represents   an   operand   (here   understood                           to   be   a   single   letter   or   digit).           Return:   In   the   function   name:   true,   if   ch   is   an   operand,   false   otherwise.     */     bool   IsOperand(char   ch)           {           if   (((ch   >=   'a')   &&   (ch   <=   'z'))   ||                 ((ch   >=   'A')   &&   (ch   <=   'Z'))   ||                 ((ch   >=   '0')   &&   (ch   <=   '9')))                 return   true;           else                 return   false;           }             /*   Given:     OperatorA         A   character   representing   an   operator   or   parenthesis.                           OperatorB         A   character   representing   an   operator   or   parenthesis.           Task:       To   determine   whether   OperatorA   takes   precedence   over   OperatorB.           Return:   In   the   function   name:   true,   if   OperatorA   takes   precedence   over                           OperatorB.     */     bool   TakesPrecedence(char   OperatorA,   char   OperatorB)           {           if   (OperatorA   ==   '(')                 return   false;           else   if   (OperatorB   ==   '(')                 return   false;           else   if   (OperatorB   ==   ')')                 return   true;           else   if   ((OperatorA   ==   '^')   &&   (OperatorB   ==   '^'))                 return   false;           else   if   (OperatorA   ==   '^')                 return   true;           else   if   (OperatorB   ==   '^')                 return   false;           else   if   ((OperatorA   ==   '*')   ||   (OperatorA   ==   '/'))                 return   true;           else   if   ((OperatorB   ==   '*')   ||   (OperatorB   ==   '/'))                 return   false;           else                 return   true;                           }             /*   Given:     Infix         A   string   representing   an   infix   expression   (no   spaces).           Task:       To   find   the   postfix   equivalent   of   this   expression.           Return:   Postfix     A   string   holding   this   postfix   equivalent.     */     void   Convert(const   string   &   Infix,   string   &   Postfix)           {           stack<char>   OperatorStack;           char   TopSymbol,   Symbol;           int   k;               for   (k   =   0;   k   <   Infix.size();   k++)                 {                 Symbol   =   Infix[k];                 if   (IsOperand(Symbol))                       Postfix   =   Postfix   +   Symbol;                 else                       {                       while   ((!   OperatorStack.empty())   &&                             (TakesPrecedence(OperatorStack.top(),   Symbol)))                             {                             TopSymbol   =   OperatorStack.top();                             OperatorStack.pop();                             Postfix   =   Postfix   +   TopSymbol;                             }                       if   ((!   OperatorStack.empty())   &&   (Symbol   ==   ')'))                             OperatorStack.pop();       //   discard   matching   (                       else                             OperatorStack.push(Symbol);                       }                 }               while   (!   OperatorStack.empty())                 {                 TopSymbol   =   OperatorStack.top();                 OperatorStack.pop();                 Postfix   =   Postfix   +   TopSymbol;                 }           }