【zzuli-1923】表达式求值
题目描述
假设表达式定义为:
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\n", S1.top());
107 }
108 return 0;
109 }