时间限制: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行,每一行对应一个表达式的值。样例输入3add(1,2)max(1,999)add(min(1,1000),add(100,99))样例输出3999200来源第四届河南省程序设计大赛
采用入栈来做.....采用递归效果一样...只是为了自己看的更加清楚..
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 }