NYOJ-------表达式求值
时间限制: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
- 来源
采用入栈来做.....采用递归效果一样...只是为了自己看的更加清楚..
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /*ÓÃ×Ö·û´®ÔÝ´æ*/ 2 #include<iostream> 3 #include<string> 4 #include<stack> 5 #include<cstring> 6 using namespace std; 7 8 int main() 9 { 10 int t,i,j; 11 double point,value,ans; 12 string str; 13 stack<string> save; 14 stack<double>tsave; 15 char temp,temsave[16]; 16 cin>>t; 17 while(t--) 18 { 19 cin>>str; 20 /*ÈëÕ»*/ 21 for(i=0;i<str.size();i++) 22 { 23 /*Çå¿Õstring×Ö·û´®*/ 24 if(str[i]=='a') 25 { 26 save.push("add"); 27 i+=2; 28 } 29 else if(str[i]=='m') 30 { 31 if(str[i+1]=='i') 32 save.push("min"); 33 else 34 save.push("max"); 35 i+=2; 36 } 37 /*¶ÔÊýÖµµÄ·ÖÎö*/ 38 /*¿¼ÂÇСÊý²¿·Ö*/ 39 else if(str[i]>='0'&&str[i]<='9'||str[i]=='.') 40 { 41 /*½«×Ö·ûת»¯³ÉÊý×Ö*/ 42 int pos=0; 43 value=point=0; 44 temp=','; 45 while(str[i]>='0'&&str[i]<='9'||str[i]=='.') 46 { 47 if(str[i]=='.'||temp=='.') 48 { 49 temsave[pos++]=str[i]; 50 temp='.'; 51 } 52 else 53 value=value*10+(str[i]-'0'); /*¶ÔÕûÊý²¿·Ö*/ 54 i++; 55 } 56 i--; 57 /*¶ÔСÊý²¿·Ö*/ 58 for(int j=pos-1;j>0;j--) 59 { 60 point=(point+(temsave[j]-'0'))*0.1; 61 } 62 if(temp=='.') 63 memset(temsave,'\0',sizeof(temsave)); 64 tsave.push(point+value); 65 } 66 else if(str[i]==')') 67 { 68 /*ÍËÕ»*/ 69 double a=tsave.top(); 70 tsave.pop(); 71 double b=tsave.top(); 72 tsave.pop(); 73 if(save.top()=="add") 74 { 75 tsave.push(a+b); 76 } 77 else if(save.top()=="max") 78 { 79 tsave.push(a>b?a:b); 80 } 81 else if(save.top()=="min") 82 { 83 tsave.push(a<b?a:b); 84 } 85 save.pop(); 86 } 87 } 88 cout<<tsave.top()<<endl; 89 tsave.pop(); 90 } 91 return 0; 92 }
代码:
编程是一种快乐,享受代码带给我的乐趣!!!