表达式求值
时间限制:
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
来源
- 第四届河南省程序设计大赛 上传者
-
张云聪
本想用个好点的方法,可是还是写的这么冗长>_<.........
import java.util.Scanner; import java.util.Stack; public class nyoj305简单表达式求值 { static Stack<Character> sch; static Stack<Long> sno; static long sum=0; static int n; static String s; public static void main(String[] args) { Scanner sc = new Scanner(System.in); n=sc.nextInt(); while(n-->0){ s=sc.next(); sch =new Stack<Character>(); sno =new Stack<Long>(); fun(); System.out.println(sno.pop()); } } private static void fun( ) { int len =s.length(); s = s+" ";//做试探用, boolean flag=false; String str=""; for(int i=0;i<len;i++){ char a = s.charAt(i); char b = s.charAt(i+1); if(a>='0'&&a<='9'){ str+=a;//收集数字 flag=true; if(b>='0'&&b<='9') continue; } if(flag){//转化数字 sum=Integer.valueOf(str); sno.add(sum); str=""; flag =false; } if(a=='a'){ sch.push('+'); i=i+3;//跳过 } else if(a=='m'){ if(b=='a') sch.push('>'); else sch.push('<'); i=i+3; } else if(a==')'){//求值,存栈 operate(); } } } private static void operate() {//操作并进栈 char a = sch.pop(); long x=sno.pop(); long y=sno.pop(); switch(a){ case '+':{sum=x+y;break;} case '>':{sum=Math.max(x, y);break;} case '<':{sum=Math.min(x, y);break;} } sno.push(sum); } }
C/C++有个标准输入,看见这代码,都快哭了 !!
#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()); } }
-
第一行: N 表示要计算的表达式个数 (1≤ N ≤ 10)