后缀表达式复习: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 }