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.*;classNUM{private intleft;private intright;public intgetLeft() {returnleft;
}public void setLeft(intleft) {this.left =left;
}public intgetRight() {returnright;
}public void setRight(intright) {this.right =right;
}
}public classMain {public static voidmain(String[] args) {
Scanner sc= newScanner(System.in);int N =sc.nextInt();sc.nextLine();
Stack stk = new Stack();
Stack stkNum = new Stack();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, intj) {return j-i;
}private static int add(int i, intj) {return i+j;
}private static int max(int i, intj) {return i>=j?i:j;
}private static int min(int i, intj) {return i>=j?j:i;
}private static NUM getNum(intp,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= newNUM();
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);
}returnnum;
}
}