第九届省赛-表达式求值(模拟)
表达式求值
时间限制:1000 ms | 内存限制:65535 KB
难度:3
- 描述
- 假设表达式定义为: 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≤ T ≤ 10) 接下来有 T 行, 每行是一个字符串,表示待求的表达式,长度<=1000
- 输出
- 【标准输出】 对于每个表达式,输出一行,表示对应表达式的值。
- 样例输入
-
3 12+2*3 12*(2+3) 12*(2+3)+Smax(333,220+280)
- 样例输出
-
18 60 69
- 来源
- 河南省第九届省赛
- 挺水的一道题,唉当时心态不行啊,被前面的题wa的不想做了;
- 代码:
-
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<stack> using namespace std; char judge(char a, char b){ if(a == '#')return '<'; if(a == '(' && b == ')') return '='; if(b == ')') return '>'; if(a == '+'){ if(b == '*' || b == '(') return '<'; else return '>'; } if(a == '*'){ if(b == '(') return '<'; else return '>'; } if(a == '(')return '<'; } bool Is_digit(char c){ if(c >= '0' && c <= '9') return true; return false; } int work(int a, char c, int b){ switch(c){ case '+': return a + b; case '*': return a * b; } } int Smax(char *s); int js(char *s){ stack<char>S; stack<int>s2; S.push('#'); for(int i = 0; s[i];){ if(s[i] == ','){ while(S.size() > 1){ if(s2.size() == 1)return s2.top(); int a = s2.top(); s2.pop(); int b = s2.top(); s2.pop(); s2.push(work(a, S.top(), b)); S.pop(); } return s2.top(); } else if(s[i] == 'S'){ int px, cnt = 0, px1; for(int j = i; s[j]; j++){ if(s[j] == '(' && cnt == 0){ px1 = j; } if(s[j] == '(') cnt++; else if(s[j] == ')') cnt--; if(cnt == 0 && s[j] == ')'){ px = j;break; } } s2.push(Smax(s + px1 + 1)); i = px + 1; } else if(Is_digit(s[i])){ int temp = 0; while(Is_digit(s[i])){ temp = temp * 10 + s[i] - '0'; i++; } // printf("%d\n", temp); s2.push(temp); } else{ int a, b; // printf("%c %c\n", S.top(), s[i]); if(S.size() == 1 && s[i] == ')'){ return s2.top(); } switch(judge(S.top(), s[i])){ case '<': S.push(s[i]); i++; break; case '>': a = s2.top(); s2.pop(); b = s2.top(); s2.pop(); s2.push(work(a, S.top(), b)); S.pop(); break; // printf("%d\n", work(a, S.top(), b)); case '=': S.pop(); i++; } } } while(S.size() > 1){ int a = s2.top(); s2.pop(); int b = s2.top(); s2.pop(); s2.push(work(a, S.top(), b)); S.pop(); } return s2.top(); } int Chenge(int x){ int temp = 0; while(x){ temp += x % 10; x /= 10; } return temp; } int Smax(char *s){ int px = 0, px2 = 0, cnt = 0; for(int i = 0; s[i]; i++){ if(s[i] == '(') cnt++; else if(s[i] == ')') cnt--; if(cnt == 0 && s[i] == ',') px = i; } return max(Chenge(js(s)), Chenge(js(s + px + 1))); } int main(){ int T; scanf("%d", &T); char s[1010]; while(T--){ scanf("%s", s); printf("%d\n", js(s)); } return 0; }