【NYOJ-35】表达式求值——简单栈练习
表达式求值
时间限制: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<iostream> 2 #include<string.h> 3 #include<stdio.h> 4 #include<stdlib.h> 5 #include<stack> 6 using namespace std; 7 8 stack<int> s; 9 10 int min(int p,int q){ 11 // if(p > q) return q; 12 // else return p; 13 return p >= q ? q : p; 14 } 15 16 int max(int p,int q){ 17 // if(p > q) return p; 18 // else return q; 19 return p >= q ? p : q; 20 } 21 22 int add(int p,int q){ 23 return p+q; 24 } 25 26 void reverse(char a[]){ 27 char b[405]; 28 memset(b,0,sizeof(b)); 29 strcpy(b,a); 30 for(int i = 0;i < strlen(a);i++) 31 a[i] = b[strlen(b)-i-1]; 32 } 33 int main(){ 34 int n; 35 char a[305],str[305]; 36 scanf("%d",&n); 37 getchar(); 38 while(n--){ 39 int k = 0,ex = 0; 40 gets(a); 41 memset(str,0,sizeof(str)); 42 if(a[strlen(a)-1] != ')'){ 43 printf("%s\n",a); 44 continue; 45 } 46 for(int i = strlen(a) - 1; i >= 3;i--){ 47 if(a[i] == ')') continue; 48 if(a[i] != ',' && a[i] != '(') str[k++] = a[i]; 49 if(a[i-1] == ',' || a[i-1] == '('){ 50 reverse(str); 51 ex = atof(str); 52 k = 0; 53 memset(str,0,sizeof(str)); 54 s.push(ex); 55 } 56 if(a[i] == '('){ 57 int p,q; //获得栈中数据 58 p = s.top(); s.pop(); 59 q = s.top(); s.pop(); 60 switch(a[i-1]){ 61 case 'd': s.push(add(p,q)); i-=3; continue; 62 case 'n': s.push(min(p,q)); i-=3; continue; 63 case 'x': s.push(max(p,q)); i-=3; continue; 64 } 65 } 66 } 67 printf("%d\n",s.top()); 68 } 69 return 0; 70 }
【总结】
字符串转为双精度数值:
1 //语法: 2 #include <stdlib.h> 3 double atof( const char *str ); 4 //功能:将字符串str转换成一个双精度数值并返回结果。参数str必须以有效数字开头,但是允许以“E”或“e”除外的任意非数字字符结尾。例如: 5 //x = atof( "42.0is_the_answer" ); 6 //x的值为42.0.
const:
关键字const用来告诉编译器一个一旦被初始化过的变量就不能再修改
const int a=5; 与 int const a=5; 等同
类名 const 对象名 与 const 类名 对象名 等同
梦想要一步步来!