【OJ】中缀表达式求值

后缀表达式复习:https://blog.csdn.net/ssjhust123/article/details/8001651

题目内容:

通过把“中缀转后缀”和“后缀求值”两个算法功能集成在一起(非简单的顺序调用),

实现对中缀表达式直接求值,新算法还是从左到右扫描中缀表达式,

但同时使用两个栈,一个暂存操作符,一个暂存操作数,来进行求值。

(支持 + - * / ^ 五种运算)

输入格式:

共1行,为1个字符串,即一个中缀表达式,

其中每个数字或符号间由一个空格隔开。

输出格式:

共1行,为一个整数,即求值的结果。

输入样例:

( 2 + 3 ) * 6 + 4 / 2

输出样例:

32

注意:

1.连接字符数字

2.pow(int,int)在dev上可以通过,但正确格式是pow(int,double)

  1 #include <iostream>
  2 #include <stack>
  3 #include <queue>
  4 #include <cmath>
  5 using namespace std;
  6 void Pop1(stack<char> &x, queue<char> &y){
  7     while (!x.empty() && (x.top() == '+' || x.top() == '-' || x.top() == '*' || x.top() == '/' || x.top() == '^')){
  8         y.push(x.top());
  9         x.pop();
 10     }
 11 }
 12 void Pop2(stack<char> &x, queue<char> &y){
 13     while (!x.empty() && (x.top() == '*' || x.top() == '/' || x.top() == '^')){
 14         y.push(x.top());
 15         x.pop();
 16     }
 17 }
 18 void Pop3(stack<char> &x, queue<char> &y){
 19     while (x.top() != '('){
 20         y.push(x.top());
 21         x.pop();
 22     }
 23     x.pop();
 24 }
 25 void Pop4(stack<char> &x, queue<char> &y){
 26     while (!x.empty() && x.top() == '^'){
 27         y.push(x.top());
 28         x.pop();
 29     }
 30 }
 31 int main(){
 32     char infix[100];
 33     char a;
 34     int b, c;
 35     int sign = 0; 
 36     stack<char> my_symbol;
 37     queue<char> my_suffix;
 38     stack<int> my_cal;
 39     cin.getline(infix, 100);
 40     for (int i = 0; i < 100; ++i){
 41         a = infix[i];
 42         if (a == ' '){
 43             sign = 0;
 44             continue;
 45         }
 46         if (a == '\0')
 47             break;
 48         if ('0' <= a && a <= '9'){
 49             my_suffix.push(a);
 50             if (sign != 0)
 51                 my_suffix.push('@');
 52             sign++;
 53             continue;
 54         }
 55         switch(a){
 56             case '(': my_symbol.push(a); break;
 57             case '+':
 58             case '-': Pop1(my_symbol, my_suffix); my_symbol.push(a); break; 
 59             case '*':
 60             case '/': Pop2(my_symbol, my_suffix); my_symbol.push(a); break;
 61             case ')': Pop3(my_symbol, my_suffix); break; 
 62             case '^': Pop4(my_symbol, my_suffix); my_symbol.push(a); break;
 63         }
 64         sign = 0;
 65     }
 66     while (!my_symbol.empty()){
 67         my_suffix.push(my_symbol.top());
 68         my_symbol.pop();
 69     }
 70     while (!my_suffix.empty()){
 71         a = my_suffix.front();
 72         my_suffix.pop();
 73         if ('0' <= a && a <= '9'){
 74             my_cal.push(a - '0');
 75             continue;
 76         }
 77         b = my_cal.top();
 78         my_cal.pop();
 79         c = my_cal.top();
 80         my_cal.pop();
 81         switch(a){
 82             case '+':
 83                 my_cal.push(c + b);
 84                 break;
 85             case '-':
 86                 my_cal.push(c - b);
 87                 break;
 88             case '*':
 89                 my_cal.push(c * b);
 90                 break;
 91             case '/':
 92                 my_cal.push(c / b);
 93                 break;
 94             case '@':
 95                 my_cal.push(c * 10 + b);
 96                 break;
 97             case '^' :
 98                 my_cal.push(pow(c, (double)b));
 99                 break;
100         }
101     }
102     cout << my_cal.top() << endl;
103     return 0;
104 }

猜你喜欢

转载自www.cnblogs.com/victorique-de-blois/p/11655914.html