NYOJ-------表达式求值

时间限制:3000 ms | 内存限制:65535 KB
难度:3
描述

Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。

假设表达式可以简单定义为:

1.一个正的十进制数x是一个表达式。

2.如果xy表达式,则 函数min(x,y)也是表达式,其值为x,y 中的最小数。

3.如果xy表达式,则 函数max(x,y)也是表达式,其值为x,y 中的最大数。

4.如果xy表达式,则 函数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 /*ÓÃ×Ö·û´®ÔÝ´æ*/
 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,'',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 }
View Code
代码:
原文地址:https://www.cnblogs.com/gongxijun/p/3419105.html