表达式计算

时间:2014-04-27 16:56:44   收藏:0   阅读:681
bubuko.com,布布扣
  1 #include<iostream>
  2 #include<string>
  3 #include<cstdlib>
  4 #include<cstring>
  5 #include<iomanip>
  6 #include<stack>
  7 using namespace std;
  8 
  9 #define OK 0
 10 #define ERROR -1
 11 #define OVERFLOW -1
 12 #define OPSETSIZE 7
 13 typedef int Status;
 14 
 15 unsigned char Prior[7][7] = {     // 表3.1  算符间的优先关系
 16         >,>,<,<,<,>,>,
 17       >,>,<,<,<,>,>,
 18       >,>,>,>,<,>,>,
 19       >,>,>,>,<,>,>,    
 20       <,<,<,<,<,=, ,
 21       >,>,>,>, ,>,>,
 22       <,<,<,<,<, ,=
 23 };        
 24 float Operate(float a, unsigned char theta, float b);
 25 char OPSET[OPSETSIZE]={+ , - , * , / ,( , ) , #};
 26 Status In(char Test,char* TestOp);
 27 char precede(char Aop, char Bop);
 28         
 29 float EvaluateExpression(string MyExp) {  // 算法3.4
 30    // 算术表达式求值的算符优先算法。
 31    // 设OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合。
 32    stack <char> OPTR;    // 运算符栈,字符元素
 33    stack <double> OPND;   // 运算数栈,实数元素
 34    char TempData[20];
 35    float Data,a,b,r;
 36    char theta,Dr[2];
 37    char c;
 38    int i=0;
 39    OPTR.push(#);
 40    c=MyExp[0];
 41    strcpy(TempData,"\0");
 42    while (c!= # || OPTR.top()!= #) {
 43       if (!In(c, OPSET)) {
 44            Dr[0]=c;
 45            Dr[1]=\0;
 46          strcat(TempData,Dr);
 47          c=MyExp[++i];
 48          if(In(c,OPSET)) {
 49             Data=(float)atof(TempData);
 50             OPND.push(Data);
 51             strcpy(TempData,"\0");
 52          }
 53       } else {   // 不是运算符则进栈
 54          switch (precede(OPTR.top(), c)) { 
 55             case <:   // 栈顶元素优先权低
 56                  OPTR.push(c);  
 57                  c=MyExp[++i];
 58                  break;
 59             case =:   // 脱括号并接收下一字符
 60                  OPTR.pop();   
 61                  c=MyExp[++i];
 62                  break;
 63             case >:   // 退栈并将运算结果入栈
 64                 theta=OPTR.top();
 65                 OPTR.pop();
 66                 b=OPND.top();
 67                 OPND.pop();
 68                 a=OPND.top();
 69                 OPND.pop();
 70                 OPND.push(Operate(a, theta, b));
 71                 break;
 72          } // switch
 73       }
 74    } // while
 75    return OPND.top();
 76 } // EvaluateExpression
 77 
 78 float Operate(float a,unsigned char theta, float b) {
 79    switch(theta) {
 80       case +: return a+b;
 81       case -: return a-b;
 82       case *: return a*b;
 83       case /: return a/b;
 84       default : return 0;
 85    } 
 86 }    
 87 
 88 Status In(char Test,char* TestOp) {
 89    bool Find=false;
 90    for (int i=0; i< OPSETSIZE; i++) {
 91       if (Test == TestOp[i]) Find= true;
 92    }
 93    return Find;
 94 }
 95 
 96 
 97 int ReturnOpOrd(char op,char* TestOp) {
 98    int i;
 99    for(i=0; i< OPSETSIZE; i++) {
100       if (op == TestOp[i]) return i;
101    }
102    return 0;
103 }
104 
105 char precede(char Aop, char Bop) {
106    return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];
107 }
108 
109 int main()
110 {
111     string Exp;
112     int t;
113     double result;
114     cin>>t;
115     while(t--){
116         cin>>Exp;
117         result=EvaluateExpression(Exp);
118         cout<<fixed<<setprecision(4)<<result<<endl;
119     }
120     return 0;
121 }
bubuko.com,布布扣

 

表达式计算,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!