NYOJ305 表达式求值(递归or栈)
2015-03-17 22:59
429 查看
题目意思:
http://acm.nyist.net/JudgeOnline/problem.php?pid=305
Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等。经过训练,Dr.Kong设计的机器人卡多甚至会计算一种嵌套的更复杂的表达式。
输入
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)
接下来有N行, 每行是一个字符串,表示待求值的表达式
(表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不
超过1000。)
输出
输出有N行,每一行对应一个表达式的值。
样例输入
样例输出
题目分析:
以前做类似的题目,都是用到栈的应用,这里是参考大神的代码给出的递归代码,很简单,遍历字符串,如果遇到‘d’,那么应该是add(),如果遇到‘x’,是max(),如果遇到‘n’,是min(),
需要注意的是无论是关键字符还是卫星字符,都要是下标自增,这里的主要技巧是递归,个人认为这个函数用的很巧妙,自己也知道这个函数 sscanf(str+first,”%d%n”,&x,&n);,从没有这么用过,受教了。。。
AC代码:
http://acm.nyist.net/JudgeOnline/problem.php?pid=305
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
题目分析:
以前做类似的题目,都是用到栈的应用,这里是参考大神的代码给出的递归代码,很简单,遍历字符串,如果遇到‘d’,那么应该是add(),如果遇到‘x’,是max(),如果遇到‘n’,是min(),
需要注意的是无论是关键字符还是卫星字符,都要是下标自增,这里的主要技巧是递归,个人认为这个函数用的很巧妙,自己也知道这个函数 sscanf(str+first,”%d%n”,&x,&n);,从没有这么用过,受教了。。。
AC代码:
/** *@xiaoran *递归 */ #include<iostream> #include<cstdio> #include<map> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<cstdlib> #include<cctype> #include<cmath> #define LL long long using namespace std; char str[1005]; int first; int Opera(){ int n,x; switch(str[first]){ case 'd':{ ++first; if(str[first-2]=='d') return Opera()+Opera(); else return Opera(); } case 'x': ++first; return max(Opera(),Opera()); case 'n': ++first; return min(Opera(),Opera()); case 'a': case 'm': case 'i': case '(': case ')': case ',': ++first; return Opera(); default:{ //将值写入x,位数写入n sscanf(str+first,"%d%n",&x,&n); first+=n; return x; } } } int main() { int n; scanf("%d",&n); while(n--){ scanf("%s",str); first=0; int res=Opera(); printf("%d\n",res); } return 0; }
相关文章推荐
- NYOJ 305 表达式求值
- NYOJ 305 表达式求值 (递归)
- NYOJ-305-表达式求值-2013年8月8日10:44:12
- NYOJ 305 表达式求值 (简单栈应用)
- nyoj 305 表达式求值
- nyoj 305 表达式求值 栈,递归(switch)和数组
- NYOJ,305,表达式求值
- NYOJ305_表达式求值
- nyoj305 表达式求值(递归)
- NYOJ-305 表达式求值【栈】
- NYOJ-305-表达式求值(第四届河南省程序设计大赛C题(模拟+栈||递归)(sscanf函数的应用))
- nyoj305-表达式求值(栈。。dfs)
- [河南省ACM省赛-第四届] 表达式求值(nyoj 305)
- nyoj305 表达式求值
- nyoj305表达式求值 栈的应用
- NYOJ-305 表达式求值(模拟)
- nyoj305_表达式求值
- NYOJ 305 表达式求值
- NYOJ-305-表达式求值(递归)
- 表达式求值(nyoj305)