中缀试转后缀试及前缀试并计算其结果

  1 /*
  2         参考大神nb的代码,感觉思路不错!终于搞明白了!一开始不明白在计算表达式的时候,利用栈到底做了什么!现在感觉我们利用栈就是模拟我们书面上计算表达式,
  3        将优先级高的运算先计算出来,然后放进栈中,等待下一次的计算
  4 */
  5 #include<iostream> 
  6 #include<string> 
  7 #include<stack>
  8 #include<cstdio>
  9 using namespace std;
 10 
 11 class node
 12 {
 13 public:
 14      double ret;
 15      string prefix, suffix;//前缀表达式和后缀表达式 
 16      node()
 17      {
 18          ret=0;
 19          prefix=suffix=""; 
 20      } 
 21 };
 22 
 23 stack<node>optd;//操作数栈
 24 stack<char>optr;//操作符栈
 25 
 26 char formula[1000];//表达式以"=" 结束 
 27 
 28 int cmp(char ch)//定义符号的优先级
 29 {
 30    switch(ch)
 31    {
 32       case '#': return -2;
 33       case '=': return -1;
 34       case '+':
 35       case '-': return 1;
 36       case '*':
 37       case '/': return 2;
 38       case '(': return 3;
 39       case ')': return 0;
 40    }
 41    return -2;
 42 }
 43 
 44 double deal(double x, char ch, double y)
 45 {
 46    switch(ch)
 47    {
 48        case '+': return x+y;
 49        case '-': return x-y;
 50        case '*': return x*y;
 51        case '/': return x/y;
 52    }
 53    return 0.0;
 54 }
 55 
 56 void cal()
 57 {
 58    int i=0, n;
 59    node num, aTmp, bTmp;
 60    while(optr.top()!='=')
 61    {
 62       if(formula[i]>='0' && formula[i]<='9')
 63       {
 64            sscanf(formula+i, "%lf%n", &num.ret, &n);
 65            num.prefix.assign(formula+i, n);
 66            num.suffix.assign(formula+i, n);
 67            i+=n;
 68            optd.push(num);
 69       }
 70       else
 71       {
 72            if(optr.top()=='(' && formula[i]==')')//消除一对括弧 
 73            {
 74          optr.pop();
 75          ++i;
 76          }
 77            if(cmp(formula[i]) > cmp(optr.top()) || optr.top()=='(')//当前运算符大于栈顶运算符直接进栈
 78      {
 79          optr.push(formula[i]);
 80          ++i;
 81      }
 82      else
 83      {
 84         char ch=optr.top(), preTmp[]={ch, ' ', '\0'}, sufTmp[]={' ', ch, '\0'} ;
 85         optr.pop();//弹出一个栈顶操作符 
 86         bTmp=optd.top(); optd.pop();//得到第二个操作数 
 87         aTmp=optd.top(); optd.pop();//得到第一个操作数 
 88         aTmp.ret=deal(aTmp.ret, ch, bTmp.ret);
 89         
 90         aTmp.suffix+=" " + bTmp.suffix + sufTmp;//得到运算后的后缀式子
 91         aTmp.prefix=preTmp + aTmp.prefix + " " + bTmp.prefix;//得到运算前的后缀式子
 92         optd.push(aTmp);//不要忘记将计算的结果放入栈中 
 93      }
 94       }
 95    }
 96    optr.pop();//别忘记弹出栈顶上的'=' 
 97 }
 98 
 99 int main()
100 {
101    optr.push('#');//初始化栈顶操作符是‘#’ 
102    while(cin>>formula)
103    {
104        cal();
105        node ans=optd.top(); optd.pop();
106        cout<<"表达式结果:"<<ans.ret<<endl<<"前缀试:"<<ans.prefix+'='<<endl<<"后缀试:"<<ans.suffix+'='<<endl; 
107    }
108    return 0;
109 }

 

posted @ 2014-06-13 13:23  hjzqyx  阅读(630)  评论(0编辑  收藏  举报