表达式求值
时间限制: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行,每一行对应一个表达式的值。 样例输入
-
3 add(1,2) max(1,999) add(min(1,1000),add(100,99))
样例输出 -
3 999 200
来源
这个题目其实涉及到了表达式求值的问题,解决这个问题无疑是使用数据结构了,一开始总是觉得似曾相识的感觉,add(1,2)运算符在前面了,后面是两个操作数其实这个是前缀表达式,例如:
a+b ---> +,a,ba+(b-c) ---> +,a,-,b,ca+(b-c)*d ---> +,a,*,-,b,c,da=1+3 ---> =,a,+,1,3中缀表达式后缀表达式最终都要转换成前缀才能方便计算的。。我的方法是构造两个栈,符号栈和运算对象栈【不一定对啊】,从左到右扫描
给出我的Java代码
public class NJ305 { private Stack s1=new Stack ();//存放数字 private Stack s2=new Stack ();//存放算符 public boolean judge(String str) { boolean b=false; if(str.equals("min")) { b=true; s2.push('<'); } else if(str.equals("max")) { b=true; s2.push('>'); } else if(str.equals("add")) { b=true; s2.push('+'); } return b; } public int count(Integer x,Integer y,char c) { if(c=='+') { return x+y; } else if(c=='<') { return Math.min(x, y); } else if(c=='>') { return Math.max(x, y); } return 0; } public void execute(String ch) { int length=ch.length(); for(int i=0;i='1'&&c<='9') { StringBuffer number =new StringBuffer(); number=number.append(c); while(i
下面是标准C++代码
#include #include #include #include #include using namespace std; int main() { char ch[1002]; int M,a,b,R; cin>>M; while(M--) { char str[4]; // 用来提取表达式中的数据 ; stack strStack; // 用来存放字符 stack intStack; // 用来存放数据(整型) memset(ch,'\0',sizeof(ch)); cin>>ch; // 输入表达式的值; for(int i=0;i<(int)strlen(ch);i++) { memset(str,'\0',sizeof(str)); if(ch[i]=='a') { strStack.push('a'); i+=2;continue;} if(ch[i]=='m'&&ch[i+1]=='i') {strStack.push('l'); i+=2; continue;} if(ch[i]=='m'&&ch[i+1]=='a') {strStack.push('b'); i+=2;continue;} if(ch[i]>='0'&&ch[i]<='9') { for(int j=i;;j++) { if(ch[j]<'0'||ch[j]>'9') { intStack.push(atoi(str)); i=j-1;break;} // 数字遍历完了,回到初始,继续以相同的规则遍历; else str[j-i]=ch[j]; } continue; } if(ch[i]==',') continue; if(ch[i]=='(') {strStack.push('(');continue;} if(ch[i]==')') { strStack.pop(); a=intStack.top(); intStack.pop(); b=intStack.top(); // 取出两个操作数; intStack.pop(); switch(strStack.top()) { case 'a': intStack.push(a+b); break; case 'l': intStack.push(a>b?b:a);break; case 'b': intStack.push(a>b?a:b);break; } strStack.pop(); continue; } } R=intStack.top(); cout<
- 第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)