java实现表达式求值 (20 分)-------非递归版

Posted bestwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

}

 

 

以上是关于java实现表达式求值 (20 分)-------非递归版的主要内容,如果未能解决你的问题,请参考以下文章

Aviator 表达式引擎 轻量级的java语言实现的表达式求值引擎

奇怪的表达式求值 (java实现)

JAVA-栈实现中序表达式求值

表达式求值(无括号)

PTA中缀表达式转换为后缀表达式并求值 (10 分)

20-表达式求值