nyoj ACM:表达式求值 (堆栈)
2017-04-02 21:37
288 查看
表达式求值
时间限制: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行,每一行对应一个表达式的值。
思路 :
对于表达式操作,首先要考虑的是用 堆栈!
题目的最优代码依然使用递归来处理的!
由于没有负数,所有定义整数型堆栈A,用所以令-1表示字符串”max” ,-2表示字符串”min”,-3表示”(“,//-4表示add
将字符串读入字符数组s中
从s[0]到s[strlen(s)-1],依次访问
如果s[j] 是’a’ ,那么表明遇到了add , 则A.push(-4) , j=j+2 ,即从add中的a跳到了第二个d
如果s[j] 是’m’且s[j+1]==’a’ ,那么表明遇到了max , 则A.push(-1) , j=j+2 ,
如果s[j] 是’m’且s[j+1]==’i’ ,那么表明遇到了min , 则A.push(-2) , j=j+2 ,
如果s[j] 是’(’ , 则A.push(-3)
如果s[j] 是’,’ , 则直接忽略
如果s[j] 是’)’ , 则A pop 两个数,再pop一个-3即”(” ,再pop的是运算符,运算完后将结果压入A中
s[j]上面都不是,那就说明是数字,这时就要注意数字不一定是各位数了。
最优代码:
用递归实现,以后有时间再来研究
时间限制: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行,每一行对应一个表达式的值。
思路 :
对于表达式操作,首先要考虑的是用 堆栈!
题目的最优代码依然使用递归来处理的!
由于没有负数,所有定义整数型堆栈A,用所以令-1表示字符串”max” ,-2表示字符串”min”,-3表示”(“,//-4表示add
将字符串读入字符数组s中
从s[0]到s[strlen(s)-1],依次访问
如果s[j] 是’a’ ,那么表明遇到了add , 则A.push(-4) , j=j+2 ,即从add中的a跳到了第二个d
如果s[j] 是’m’且s[j+1]==’a’ ,那么表明遇到了max , 则A.push(-1) , j=j+2 ,
如果s[j] 是’m’且s[j+1]==’i’ ,那么表明遇到了min , 则A.push(-2) , j=j+2 ,
如果s[j] 是’(’ , 则A.push(-3)
如果s[j] 是’,’ , 则直接忽略
如果s[j] 是’)’ , 则A pop 两个数,再pop一个-3即”(” ,再pop的是运算符,运算完后将结果压入A中
s[j]上面都不是,那就说明是数字,这时就要注意数字不一定是各位数了。
#include<iostream> #include<cstdio> #include<stack> #include<cstring> using namespace std; int main() { int N; scanf("%d",&N); for(int i=0;i<N;i++) { char s[600]; scanf("%s",s); stack<int> A;//由于没有负数,所以令-1表示字符串"max" ,-2表示字符串"min",-3表示"(" int l=strlen(s); for(int j=0;j<l;j++) { if(s[j]=='a') //-4表示add { A.push(-4); j=j+2; continue; } if(s[j]=='m'&&s[j+1]=='a') { A.push(-1); j=j+2;//for还会加一个1 continue; } else if(s[j]=='m'&&s[j+1]=='i') { A.push(-2); j=j+2;//for还会加一个1 continue; } else if(s[j]=='(') { A.push(-3); continue; } else if(s[j]==',') { continue; } else if(s[j]==')') { int B=A.top(); A.pop(); int C=A.top(); A.pop(); int D=A.top(); A.pop(); int E=A.top(); A.pop(); if(E==-1) A.push(max(B,C)); else if(E==-2) A.push(min(B,C)); else if(E=-4) A.push(B+C); continue; } int y=s[j]; int x=0;; while(y>='0' && y<='9') { j++; x=x*10+(y-'0'); y=s[j]; } j--; A.push(x); } printf("%d\n",A.top()); A.pop(); } 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()); } }
相关文章推荐
- 堆栈之表达式求值
- 表达式求值----c++-----堆栈实现
- 表达式求值 【堆栈】
- 利用堆栈实现表达式求值
- 左求值表达式,堆栈,调试陷阱与ORM查询语言的设计
- 堆栈经典应用:表达式求值、后缀表达式
- 用堆栈实现表达式的求值
- 表达式求值--堆栈应用
- 数据结构 学习笔记(三):线性结构:堆栈,队列,表达式求值,多项式加法运算
- 1153 堆栈的使用 括号匹配 表达式求值 (对输入表达式的处理)
- 堆栈应用:表达式求值
- 栈的应用 表达式求值
- 表达式求值 c++语言
- 【ThinkingInC++】1、三写表达式求值
- 简单后缀表达式求值
- C++使用引用计数的例子:表达式求值
- 算法 八皇后 表达式求值-栈
- 技海无涯:正则表达式相关的知识和技术(3)——编程技巧:堆栈的本质探讨
- 【工作笔记0009】VS异常:由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值。
- 表达式求值 ACM 数据结构