表达式求值
时间限制: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
- 来源
- 第四届河南省程序设计大赛
AC代码:
import java.util.Scanner; import java.util.Stack; public class Main { private static int partation(String expression) { Stack<Character> stack = new Stack<Character>(); for (int i = 0; i < expression.length(); i++) { if (expression.charAt(i) == '(') { stack.push('('); } if (expression.charAt(i) == ')') { stack.pop(); } if (expression.charAt(i) == ',' && stack.isEmpty()) { return i; } } return -1; } private static int eval(String expression) { boolean isValue = true; for (int i = 0; i < expression.length(); i++) { if (!(expression.charAt(i) >= '0' && expression.charAt(i) <= '9')) { isValue = false; break; } } if (isValue) { return Integer.valueOf(expression); } int left = expression.indexOf('('); int right = expression.length() - 1; String subExp = expression.substring(left + 1, right); int index = partation(subExp); String expLeft = subExp.substring(0, index), expRight = subExp .substring(index + 1); if (expression.charAt(1) == 'd') { return eval(expLeft) + eval(expRight); } else if (expression.charAt(1) == 'i') { return Math.min(eval(expLeft), eval(expRight)); } else { return Math.max(eval(expLeft), eval(expRight)); } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int t = cin.nextInt(); while ((t--) > 0) { String exp = cin.next(); System.out.println(eval(exp)); } } }
RuntimeError代码:
import java.util.Scanner; import java.util.Stack; public class Main{//RuntimeError -- -- java 2013-08-01 10:47:01 public static void main(String[] args) { Scanner input=new Scanner(System.in); int N=input.nextInt(); while(N-->0){ String s=input.next(); if(s.endsWith(" ")) s=s.substring(0,s.length()-1); Stack<String> stack1=new Stack<String>(); Stack<Integer> stack2=new Stack<Integer>(); boolean ok=false; int x=0; for(int i=0;i<s.length();i++){ char g=s.charAt(i); if(g>='0'&&g<='9'&&ok){ x=i; ok=false; } else if(g=='a'||g=='m'){ stack1.add(s.substring(i, i+3)); i=i+3; ok=true; } else if(g==','&&ok==false){ stack2.add(Integer.parseInt(s.substring(x,i))); ok=true; } else if(g==')'){ if(ok==false) stack2.add(Integer.parseInt(s.substring(x,i))); int a=stack2.pop(); int b=stack2.pop(); if(stack1.peek().equals("add")) stack2.add(a+b); else if(stack1.peek().equals("min")){ stack2.add(Math.min(a, b)); } else{ stack2.add(Math.max(a, b)); } stack1.pop(); ok=true; } } System.out.println(stack2.pop()); } } }
import java.util.Scanner; import java.util.Stack; public class Main{//RuntimeError -- -- java 08-01 10:47:01 static Stack<String> stack1; static Stack<Integer> stack2; public static void main(String[] args) { Scanner input=new Scanner(System.in); int N=input.nextInt(); while(N-->0){ String s=input.next(); stack1=new Stack<String>(); stack2=new Stack<Integer>(); F(s); System.out.println(stack2.pop()); } } private static void F(String s) { if(s.length()<=0) return; char g=s.charAt(0); if(g=='a'||g=='m'){ stack1.add(s.substring(0, 4)); F(s.substring(4)); } else if(g>='0'&&g<='9'){ int c=0; for(int i=0;i<s.length();i++){ if(!(s.charAt(i)>='0'&&s.charAt(i)<='9')){ c=i; break; } } int num=Integer.valueOf(s.substring(0, c)); stack2.add(num); F(s.substring(c)); } else if(g==')'){ String str=stack1.pop(); if(str.equals("add(")){ stack2.add(stack2.pop()+stack2.pop()); } else if(str.equals("min(")){ stack2.add(Math.min(stack2.pop(),stack2.pop())); } else{ stack2.add(Math.max(stack2.pop(),stack2.pop())); } F(s.substring(1)); } else if(g==',') F(s.substring(1)); } }