java实现表达式求值 (20 分)-------非递归版
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之和。 5、 如果x和y是表达式,则函数sub(x,y)也是表达式,其值为x,y之差。 例如,表达式 max(add(1,2),7)的值为7。
请你编写程序,对于给定的一组表达式,帮助Dr.Kong算出正确答案,以便校对卡多计算的正误。
输入格式:
第一行:N表示要计算的表达式个数(1≤N≤10) 接下来有N行,每行是一个字符串,表示待求值的表达式。 (表达式中不会有多余的空格,每行不超过300个字符,表达式中出现的十进制数都不超过1000)
输出格式:
输出有N行,每一行对应一个表达式的值。
输入样例:
在这里给出一组输入。例如:
3
add(1,2)
sub(1,999)
add(min(1,1000),add(100,99))
输出样例:
在这里给出相应的输出。例如:3
-998 200
代码:
import java.util.*; class NUM{ private int left; private int right; public int getLeft() { return left; } public void setLeft(int left) { this.left = left; } public int getRight() { return right; } public void setRight(int right) { this.right = right; } } public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt();sc.nextLine(); Stack<String> stk = new Stack<String>(); Stack<Integer> stkNum = new Stack<Integer>(); int k=0; for(int i =0 ;i< N;i++){ String line = sc.nextLine(); if(line.length() == 1){ int num = Integer.parseInt(line); System.out.println(num); }else{ int index = 0; int p=0; while(true){ index = line.indexOf("(",index+1); if(index == -1) break; p = line.indexOf(",",p+1); if(p == -1) break; NUM num = getNum(p,line); if(num.getLeft()!=-999){ stkNum.push(num.getLeft()); } if(num.getRight()!=-999) { stkNum.push(num.getRight()); } String sub = line.substring(index-3, index); stk.push(sub); } while(stk.size()!=0){ String opt = stk.pop(); if(opt.equals("min")){ int d = min(stkNum.pop(),stkNum.pop()); stkNum.push(d); }else if(opt.equals("max")){ int d = max(stkNum.pop(),stkNum.pop()); stkNum.push(d); }else if(opt.equals("add")){ int d = add(stkNum.pop(),stkNum.pop()); stkNum.push(d); }else if(opt.equals("sub")){ int d = sub(stkNum.pop(),stkNum.pop()); stkNum.push(d); } } System.out.println(stkNum.pop()); k=0; } } sc.close(); } private static int sub(int i, int j) { return j-i; } private static int add(int i, int j) { return i+j; } private static int max(int i, int j) { return i>=j?i:j; } private static int min(int i, int j) { return i>=j?j:i; } private static NUM getNum(int p,String line){ int a=p,b=p; while(!line.substring(a, a+1).equals("(") && !line.substring(a, a+1).equals(")")){ a--; } while(!line.substring(b, b+1).equals(")")&& !line.substring(b, b+1).equals("m")&& !line.substring(b, b+1).equals("a") && !line.substring(b, b+1).equals("s")){ b++; } String left = line.substring(a+1, p); String right = line.substring(p+1, b); NUM num = new NUM(); num.setLeft(-999); num.setRight(-999); if(left.length()>=1){ int lNum = Integer.parseInt(left); num.setLeft(lNum); } if(right.length() >= 1) { int rNum = Integer.parseInt(right); num.setRight(rNum); } return num; } }