题目描述
假设表达式定义为:
1. 一个十进制的正整数 X 是一个表达式。
2. 如果 X 和 Y 是 表达式,则 X+Y, X*Y 也是表达式; *优先级高于+.
3. 如果 X 和 Y 是 表达式,则 函数 Smax(X,Y)也是表达式,其值为:先分别求出 X ,Y
值的各位数字之和,再从中选最大数。
4.如果 X 是 表达式,则 (X)也是表达式。
例如:
表达式 12*(2+3)+Smax(333,220+280) 的值为 69。
请你编程,对给定的表达式,输出其值。
输入
第一行: T 表示要计算的表达式个数 ($1 le T le 10$)
接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000
输出
对于每个表达式,输出一行,表示对应表达式的值。
样例输入
3
12+2*3
12*(2+3)
12*(2+3)+Smax(333,220+280)
样例输出
18
60
69
1.将中缀表达式转化成后缀表达式。如果是整数直接输出,如果是运算符且比栈顶元素优先极高就压入栈顶,否则弹出栈顶运算符。其中左括号优先级最低,但是遇到无条件压栈,遇到右括号就将栈内的运算符弹出,直到遇到左括号,左右括号不输出;新定义运算规则Smax可以看做运算符为','。
2.将后缀表达式求值。将后缀表达式入栈,遇到运算符则弹出栈顶两个数进行运算,遇到新定义运算','特殊考虑一下即可。
1 #include <bits/stdc++.h> 2 using namespace std; 3 string s; 4 string houzhui[1004]; 5 map<char, int>M; 6 int ret_num(string s) 7 { 8 int l = s.size(), sum = 0; 9 for(int i = 0; i < l; i++) 10 { 11 if(s[i] >= '0' && s[i] <= '9') 12 sum = sum*10+s[i]-'0'; 13 else return -1; 14 } 15 return sum; 16 } 17 int Bit(int n) 18 { 19 int sum = 0; 20 while(n) 21 { 22 sum += n%10; 23 n /= 10; 24 } 25 return sum; 26 } 27 int main() 28 { 29 int n; 30 stringstream ss; 31 string s1; 32 cin>>n; 33 M['('] = 0, M[','] = 1, M['+'] = 2, M['*'] = 3; 34 while(n--) 35 { 36 cin>>s; 37 stack<char>S; 38 int l = s.size(), c = 0, num = 0; 39 for(int i = 0; i < l; i++) 40 { 41 if(s[i] == 'S' || s[i] == 'm' || s[i] == 'a' || s[i] == 'x') continue; 42 if(s[i] >= '0' && s[i] <= '9') num = num*10+s[i]-'0'; 43 else 44 { 45 if(num != 0)//两运算符相邻的情况 46 { 47 ss.clear(); 48 ss<<num, ss>>s1; 49 houzhui[c++] = s1; 50 num = 0; 51 } 52 53 if(s[i] == '(') S.push(s[i]); 54 else if(s[i] == ')') 55 { 56 while(S.top() != '(') 57 { 58 houzhui[c++] = S.top(); 59 S.pop(); 60 } 61 S.pop(); 62 } 63 else 64 { 65 while(!S.empty() && M[S.top()] >= M[s[i]]) 66 { 67 houzhui[c++] = S.top(); 68 S.pop(); 69 } 70 S.push(s[i]); 71 } 72 } 73 } 74 ss.clear(); 75 if(num != 0) 76 { 77 ss<<num, ss>>s1; 78 houzhui[c++] = s1; 79 } 80 while(!S.empty()) 81 { 82 houzhui[c++] = S.top(); 83 S.pop(); 84 } 85 stack<int>S1; 86 for(int i = 0; i < c; i++) 87 { 88 num = ret_num(houzhui[i]);//判断是否是整数若是返回其值,不是返回-1(数不可能为负) 89 if(num != -1) S1.push(num); 90 else 91 { 92 int n2 = S1.top(); 93 S1.pop(); 94 int n1 = S1.top(); 95 S1.pop(); 96 if(houzhui[i] == "+") S1.push(n1+n2); 97 else if(houzhui[i] == "*") S1.push(n1*n2); 98 else 99 { 100 int bit1 = Bit(n1); 101 int bit2 = Bit(n2); 102 S1.push(max(bit1, bit2)); 103 } 104 } 105 } 106 printf("%d ", S1.top()); 107 } 108 return 0; 109 }