java写组求值_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.*;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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值