表达式求值
时间限制:3000 ms | 内存限制:65535 KB
难度:3
- 描述
-
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
假设表达式可以简单定义为:
1. 一个正的十进制数 x 是一个表达式。
2. 如果 x 和 y 是 表达式,则 函数min(x,y )也是表达式,其值为x,y 中的最小数。
3. 如果 x 和 y 是 表达式,则 函数max(x,y )也是表达式,其值为x,y 中的最大数。
4.如果 x 和 y 是 表达式,则 函数add(x,y )也是表达式,其值为x,y 之和。
例如, 表达式 max(add(1,2),7) 的值为 7。
请你编写程序,对于给定的一组表达式,帮助 Dr.Kong 算出正确答案,以便校对卡多计算的正误。
- 输入
- 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。) - 输出
- 输出有N行,每一行对应一个表达式的值。
- 样例输入
-
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
- 样例输出
-
3 999 200
- 来源
栈的使用
1 #include<stdio.h> 2 #include<stack> 3 #include<string.h> 4 using namespace std; 5 int main() { 6 stack<int >b; 7 stack<int >d; 8 char c[330]; 9 int i,t,j,su,sun,l; 10 scanf("%d",&t); 11 getchar(); 12 while(t--) { 13 14 15 while(!b.empty()) { //清空b栈 16 b.pop(); 17 } 18 19 while(!d.empty()) { //清空d栈 20 d.pop(); 21 } 22 23 memset(c,0,sizeof(c)); 24 scanf("%s",c); 25 l=strlen(c); 26 for(i=0; i<l; i++) { 27 if(c[i]=='a'&&c[i+1]=='d') { 28 29 d.push(-1); 30 31 } 32 33 else if(c[i]=='i') { 34 35 d.push(-2); 36 37 } else if(c[i]=='x') { 38 39 d.push(-3); 40 41 } else if(c[i]>='0'&&c[i]<='9') { 42 sun=0; 43 for(j=i; j<l; j++) { 44 45 if(c[j]<'0'||c[i]>'9') { 46 break; 47 } 48 sun=sun*10+(c[j]-'0'); 49 i++; 50 } 51 d.push(sun); 52 } 53 } 54 55 while(!d.empty()) { 56 int aa=0,cc=0,bb=0; 57 aa=d.top(); 58 d.pop(); 59 if(aa>=0) { 60 b.push(aa); 61 } else { 62 cc=b.top(); 63 b.pop(); 64 bb=b.top(); 65 b.pop(); 66 67 if(aa==-1) { 68 cc=cc+bb; 69 } else if(aa==-2) { 70 cc=cc>bb?bb:cc; 71 } else if(aa==-3) { 72 cc=cc>bb?cc:bb; 73 } 74 b.push(cc); 75 } 76 } 77 printf("%d ",b.top()); 78 79 } 80 81 return 0; 82 83 }