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;
        }
    
    }
     
  • 相关阅读:
    李洪强IOS经典面试题 33-计算有多少个岛屿
    李洪强iOS经典面试题32-简单介绍 ARC 以及 ARC 实现的原理
    李洪强iOS经典面试题31-解释垃圾回收的原理
    iOS音频合并
    Macbook小问题
    weex-iOS集成
    WEEX快速入门
    Mac上Nginx-增加对HLS的支持
    iOS直播-基于RTMP的视频推送
    iOS直播-播放基于RTMP协议的视频
  • 原文地址:https://www.cnblogs.com/HoweZhan/p/11946377.html
Copyright © 2011-2022 走看看