前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >NYOJ-------表达式求值

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

作者头像
Gxjun
发布2018-03-21 13:13:30
6740
发布2018-03-21 13:13:30
举报
文章被收录于专栏:mlml

时间限制: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来源第四届河南省程序设计大赛

采用入栈来做.....采用递归效果一样...只是为了自己看的更加清楚..

代码语言:javascript
复制
 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 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2013-11-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档