后缀表达式求值

只写出了正负整数的加减乘除,没有设计小数的,感觉写的太复杂了,但是又没有想到更简洁的方法

Code:
  1. double Calculate(string &postfix)   
  2. {   
  3.     struct  
  4.     {   
  5.         double data[MAX];   
  6.         int top;   
  7.     }   
  8.     op;//定义栈:存储可计算的数字   
  9.     int i = 0;   
  10.     char ch;   
  11.     double x;   
  12.     bool flag = false;//负数标志,值为true时为负数   
  13.     op.top = -1;   
  14.     ch = postfix[i];   
  15.     i++;   
  16.   
  17.     while (ch != '/0')   
  18.     {   
  19.         switch (ch)   
  20.         {   
  21.         case '+':   
  22.             op.data[op.top-1] = op.data[op.top-1] + op.data[op.top];   
  23.             op.top--;   
  24.             break;   
  25.         case '-':   
  26.             if(postfix[i] == ' ' || postfix[i] == '/0')//为减号‘-’时压栈,为负号‘-’时,此处不处理   
  27.             {   
  28.                 op.data[op.top-1] = op.data[op.top-1] - op.data[op.top];   
  29.                 op.top--;   
  30.             }   
  31.             break;   
  32.         case '*':   
  33.             op.data[op.top-1] = op.data[op.top-1] * op.data[op.top];   
  34.             op.top--;   
  35.             break;   
  36.         case '/':   
  37.             if (op.data[op.top] != 0)   
  38.             {   
  39.                 op.data[op.top-1] = op.data[op.top-1] / op.data[op.top];   
  40.             }   
  41.             else  
  42.             {   
  43.                 cout << "The divisor is 0" << endl;   
  44.             }   
  45.             op.top--;   
  46.             break;   
  47.         case ' ':   
  48.             break;   
  49.         default ://将连续的数字字符转化为可运算的数字   
  50.             x = 0;   
  51.             flag = false;   
  52.             if (postfix[i-2] == '-')//判读是否为负数   
  53.             {   
  54.                 flag = true;   
  55.             }   
  56.             while (ch >= '0' && ch <= '9')//将字符转化为可计算的数   
  57.             {   
  58.                 ch = ch - '0';   
  59.                 x = 10 * x + ch;   
  60.                 ch = postfix[i];   
  61.                 i++;   
  62.             }   
  63.             if (flag)//若为负数,则取反   
  64.             {   
  65.                 x = 0 - x;   
  66.             }   
  67.             op.top++;   
  68.             op.data[op.top] = x;   
  69.             break;   
  70.         }   
  71.         ch = postfix[i];   
  72.         i++;   
  73.     }   
  74.     return op.data[op.top];   
  75. }  

 

你可能感兴趣的:(后缀表达式求值)