第四届省赛原题 表达式求值
来源:互联网 发布:公司如何屏蔽淘宝网 编辑:程序博客网 时间:2024/05/27 08:13
表达式求值
时间限制: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))
- 样例输出
3999
200
#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>#include<stack>using namespace std;stack<int>shu;char ch[1010];int main(){ int t; scanf("%d ",&t); while(t--) { scanf("%s",ch); int len=strlen(ch); int i; for(i=len-1;i>=0;i--) { if(ch[i]>='0'&&ch[i]<='9') { int sum=0; int k=i; while(ch[i]>='0'&&ch[i]<='9') i--; for(int j=i+1;j<=k;j++) sum=sum*10+ch[j]-'0'; shu.push(sum); i++;//之所以又++是因为i减到了非数字的位子,if这条语句执行完之后i就会再减一} else if(ch[i]=='n') { int numA=shu.top(); shu.pop(); int numB=shu.top(); shu.pop(); int num=min(numA,numB); shu.push(num); } else if(ch[i]=='x') { int numA=shu.top(); shu.pop(); int numB=shu.top(); shu.pop(); int num=max(numA,numB); shu.push(num); } else if(ch[i]=='d'&&ch[i-1]=='d') { int numA=shu.top(); shu.pop(); int numB=shu.top(); shu.pop(); int num=numA+numB; shu.push(num); } } int s=shu.top(); printf("%d\n",s); } return 0;}
下面这个算法是采用递归来写的:#include<cstdio>#include<iostream>using namespace std;char str[1000];int start;int val(){ int v,n; switch(str[start]) { case 'm':start+=3;if(str[start-2]=='i') return min(val(),val());else return max(val(),val()); case 'a':start+=3;return val()+val(); case ')': case '(': case ',':++start;return val(); default:sscanf(str+start,"%d%n",&v,&n);start+=n;return v; }}int main(){ int n; scanf("%d",&n); while(n--) { scanf("%s",str); start=0; printf("%d\n",val()); } return 0;}
1 0
- 第四届省赛原题 表达式求值
- 第四届河南省ACM 表达式求值 栈
- XYNUOJ 第四次考试 表达式求值
- noj 305 表达式求值 第四届河南省程序设计大赛//待续~~~
- 算法(第四版) Dijkstra 算数表达式求值算法-双栈
- nyoj305表达式求值(第四届河南省程序设计大赛)
- 河南第四届ACM省赛(表达式求值)
- 第四届河南省程序设计大赛-表达式求值,双栈过!
- NYOJ305 表达式求值(河南省第四届ACM省赛)
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- 表达式求值
- c++ 普通函数 虚函数 纯虚函数 代码例子
- 远程访问DVMA
- [离线+树状数组 || 主席树]BZOJ1878: [SDOI2009]HH的项链
- [leetCode刷题笔记]22. Generate Parentheses
- 存储引擎
- 第四届省赛原题 表达式求值
- C++primer学习笔记-----4.5~4.7
- java并发volatile的使用
- java虚拟机 synchronized锁优化
- NYOJ-开心的小明【动态规划|01背包】
- const关键字
- 【正一专栏】王者的尊严和荣耀
- 转动健身good
- GO指南