zoukankan      html  css  js  c++  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.*;
    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;
        }
    
    }
     
  • 相关阅读:
    37. Sudoku Solver(js)
    36. Valid Sudoku(js)
    35. Search Insert Position(js)
    34. Find First and Last Position of Element in Sorted Array(js)
    33. Search in Rotated Sorted Array(js)
    32. Longest Valid Parentheses(js)
    函数的柯里化
    俞敏洪:我和马云就差了8个字
    vue路由传值params和query的区别
    简述vuex的数据传递流程
  • 原文地址:https://www.cnblogs.com/HoweZhan/p/11946377.html
Copyright © 2011-2022 走看看