题解 | #四则运算#

四则运算

http://www.nowcoder.com/questionTerminal/9999764a61484d819056f807d2a91f1e

    liyon
    static boolean flag = false;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();



        int num = 0;
        int length = s.length();
        boolean flag = false;

        //消除()
        Deque<Character> stack1 = new LinkedList<>();
        while(s.contains("(") && s.contains(")")){
            String left = "";
            String middle ="";
            String right ="";

            for (int i = 0; i < s.length(); i++) {
                stack1.push(s.charAt(i));
            }

            while(!stack1.isEmpty()){
                if(stack1.peek() == '(' && middle.equals("")){
                    stack1.pop();
                    middle = right;
                }else if(!middle.equals("")){
                    left = stack1.pop() + left;
                }else{
                    right = stack1.pop() + right;
                }
            }
            right =  middle.substring(middle.indexOf(")")+1,middle.length());
            middle = middle.substring(0,middle.indexOf(")"));
            s = left + calNum(middle) + right;
        }
         //消除[]
        while(s.contains("[") && s.contains("]")){
            String left = "";
            String middle ="";
            String right ="";

            for (int i = 0; i < s.length(); i++) {
                stack1.push(s.charAt(i));
            }

            while(!stack1.isEmpty()){
                if(stack1.peek() == '[' && middle.equals("")){
                    stack1.pop();
                    middle = right;
                }else if(!middle.equals("")){
                    left = stack1.pop() + left;
                }else{
                    right = stack1.pop() + right;
                }
            }
            right =  middle.substring(middle.indexOf("]")+1,middle.length());
            middle = middle.substring(0,middle.indexOf("]"));
            s = left + calNum(middle) + right;
        }
         //消除{}
        while(s.contains("{") && s.contains("}")){
            String left = "";
            String middle ="";
            String right ="";

            for (int i = 0; i < s.length(); i++) {
                stack1.push(s.charAt(i));
            }

            while(!stack1.isEmpty()){
                if(stack1.peek() == '[' && middle.equals("")){
                    stack1.pop();
                    middle = right;
                }else if(!middle.equals("")){
                    left = stack1.pop() + left;
                }else{
                    right = stack1.pop() + right;
                }
            }
            right =  middle.substring(middle.indexOf("}")+1,middle.length());
            middle = middle.substring(0,middle.indexOf("}"));
            s = left + calNum(middle) + right;
        }

        int res = calNum(s);
        if(flag) System.out.println("");
        System.out.println(res);
    }

    //计算
    public static int calNum(String middle){
        Deque<Integer> stack = new LinkedList<>();
        int num = 0;
        char pre = '+';
        int length = middle.length();
        boolean isLianXuFuHao = false;
        for (int i = 0; i < length; i++) {
            char c = middle.charAt(i);
            if(Character.isDigit(c)){
                num = num * 10 + c -'0';
            }
            if(num == 0 && (pre == '*' || pre =='/') && c =='-' && i>1){
                isLianXuFuHao = true;
                continue;
            }
            if(flag) break;
            if (!Character.isDigit(c) && c != ' ' || i == length -1){
                switch (pre){
                    case '+' :
                        stack.push(num);
                        break;
                    case '-' :
                        stack.push(-num);
                        break;
                    case '*' :
                        if(isLianXuFuHao) {
                            stack.push(stack.pop() * -num);
                            isLianXuFuHao = false;
                        }else{
                            stack.push(stack.pop() * num);
                        }
                        break;
                    case '/' :
                        if(isLianXuFuHao) {
                            stack.push(stack.pop() / -num);
                            isLianXuFuHao = false;
                        }else{
                            stack.push(stack.pop() / num);
                        }

                        break;
                    default:
                        flag=true;
                        break;
                }
                pre = c;
                num = 0;
            }

        }
        int res = 0;
        while(!stack.isEmpty()){
            res += stack.pop();
        }
        return res;
    }
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:46
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
一表renzha:手写数字识别就是一个作业而已
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 11:45
你不要过来啊啊啊啊啊啊啊
码农索隆:对面:“今天你不面也得面”
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务