1 #include <iostream>
  2 #include <stack>
  3 #include <stdio.h>
  4 
  5 using namespace std;
  6 
  7 char str[220];  //表达式字符串
  8 int mat[][5]=
  9 {
 10     1,0,0,0,0,
 11     1,0,0,0,0,
 12     1,0,0,0,0,
 13     1,1,1,0,0,
 14     1,1,1,0,0,
 15 };  //优先级矩阵
 16 
 17 stack<int> op; //保存运算符标号,+-*/依次为1,2,3,4
 18 stack<double> in;//运算数
 19 
 20 void getOp(bool &reto,int &retn,int &i)
 21 {//获得表达式的下一个元素函数,若reto为true,表示该元素为一个运算符,其编号保存在retn中;
 22     //否则,若reto为false,表示该元素为一个运算数,其值保存在引用变量retn中。
 23     //引用变量i表示遍历的字符串下标
 24     if(i==0&&op.empty()==true)
 25     {
 26         reto=true;
 27         retn=0;
 28         return;
 29     }
 30     if(str[i]==0)
 31     {
 32         reto=true;
 33         retn=0;
 34         return;
 35     }
 36     if(str[i]>='0'&&str[i]<='9')
 37     {
 38         reto=false;
 39     }
 40     else
 41     {
 42         reto=true;
 43         if(str[i]=='+')
 44         {
 45             retn=1;
 46         }
 47         else if(str[i]=='-')
 48         {
 49             retn=2;
 50         }
 51         else if(str[i]=='*')
 52         {
 53             retn=3;
 54         }
 55         else if(str[i]=='/')
 56         {
 57             retn=4;
 58         }
 59         i+=2;
 60         return;
 61     }
 62     retn=0;//返回结果为数字
 63     for(;str[i]!=' '&&str[i]!=0;i++)
 64     {
 65         retn*=10;
 66         retn+=str[i]-'0';
 67     }//计算该数字的数字值
 68     if(str[i]==' ')
 69         i++;
 70     return;
 71 }
 72 
 73 int main()
 74 {
 75     while(gets(str))
 76     {
 77         if(str[0]=='0'&&str[1]==0)
 78             break;//输入只有一个0,退出
 79         bool retop;
 80         int retnum;
 81         int idx=0;
 82         while(!op.empty())
 83             op.pop();
 84         while(!in.empty())
 85             in.pop(); //清空数字栈和运算符栈
 86         while(true)
 87         {
 88             getOp(retop,retnum,idx);
 89             if(retop==false)
 90             {
 91                 in.push((double)retnum);
 92             }
 93             else
 94             {
 95                 double tmp;
 96                 if(op.empty()==true||mat[retnum][op.top()]==1)
 97                 {//若运算符栈为空或当前遍历到的运算符优先级大于栈顶运算符,
 98                     //将该运算符压入运算符堆栈
 99                     op.push(retnum);
100                 }
101                 else
102                 {
103                     while(mat[retnum][op.top()]==0)
104                     {
105                         int ret=op.top();
106                         op.pop();
107                         double b=in.top();
108                         in.pop();
109                         double a=in.top();
110                         in.pop();
111 
112                         if(ret==1)
113                             tmp=a+b;
114                         else if(ret==2)
115                             tmp=a-b;
116                         else if(ret==3)
117                             tmp=a*b;
118                         else
119                             tmp=a/b;
120                         in.push(tmp);
121                     }
122                     op.push(retnum);
123                 }
124             }
125 
126             if(op.size()==2&&op.top()==0)
127                 break;//若运算符栈只有两个元素,且其栈顶元素为标记运算符,则表示该表达式求值结束
128 
129         }
130         printf("%.2f\n",in.top());
131     }
132     return 0;
133 }

 

posted on 2016-01-07 15:16  Xbert  阅读(250)  评论(0编辑  收藏  举报