题解 | #四则运算#

四则运算

https://www.nowcoder.com/practice/9999764a61484d819056f807d2a91f1e

import java.util.*;
import java.util.regex.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Map<Character, Integer> map = new HashMap<Character, Integer>();
        map.put(')', 0);
        map.put('(', 0);
        map.put('*', 2);
        map.put('/', 2);
        map.put('+', 1);
        map.put('-', 1);
        map.put('#', 1);
        Pattern p = Pattern.compile("[0-9]");
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.nextLine()
                    .replaceAll("\\[", "(")
                    .replaceAll("]", ")")
                    .replaceAll("\\{", "(")
                    .replaceAll("}", ")");
             Stack<String> numStack = new Stack<String>();
            Stack<Character> symbolStack = new Stack<Character>();
            char[] chars = str.toCharArray();
            for (int i = 0; i < chars.length; i++) { 
                char c = chars[i];
                if ((c == '-' && ((chars[i - 1] < '0' || chars[i - 1] > '9') && chars[i-1]!=')')) || 
                    (c == '-' && i == 0)) { //处理负号
                    c = '#';
                }
                if (c >= '0' && c <= '9') { //处理数字
                    StringBuilder sb = new StringBuilder(String.valueOf(c));
                    for(int j=i+1; j<chars.length;j++) { //处理两位数以上
                        if(chars[j]>='0' && chars[j] <= '9') {
                            sb.append(chars[j]);
                            i=j;
                        } else {
                            break;
                        }
                    }
                    numStack.push(sb.toString());
                } else if (c == '(') { //"(" 直接入栈
                    symbolStack.push(c);
                } else if (c != ')') { // 非")"的符号
                    if (symbolStack.isEmpty()) { //符号栈空直接入栈
                        symbolStack.push(c);
                    } else { 
                        while (!symbolStack.isEmpty()) {
                            if (map.get(c) > map.get(symbolStack.peek())) { //判断优先级
                                symbolStack.push(c);
                                break;
                            } else {
                                numStack.push(String.valueOf(symbolStack.peek()));
                                symbolStack.pop();
                            }
                        }
                        if(symbolStack.isEmpty()) { //优先级判断完成后栈空,入栈
                            symbolStack.push(c);
                        }
                    }
                } else if (c == ')') { //遇到 "(" ,符号栈依次出栈,直到"(" 出栈
                    while (!symbolStack.isEmpty()) {
                        if (symbolStack.peek() == '(') {
                            symbolStack.pop();
                            break;
                        } else {
                            numStack.push(String.valueOf(symbolStack.peek()));
                            symbolStack.pop();
                        }
                    }
                }
            }
            while (!symbolStack.isEmpty()) { //将剩余的符号按次序出栈
                numStack.push(String.valueOf(symbolStack.peek()));
                symbolStack.pop();
            }
            int length = numStack.size();
            Stack<String> currStack = new Stack<String>();
            for(int i=0;i<length;i++) { //反转后缀表达式栈
                currStack.push(numStack.peek());
                numStack.pop();
            }
            numStack.clear();
            double sum = 0;
            Stack<Double> sumStack = new Stack<Double>();
            for (int i = 0; i < length; i++) {
                String c = currStack.peek();
                if (p.matcher(c).find()) { //数字直接入结果栈
                    sumStack.add(Double.parseDouble(c));
                } else if (c.equals("#")) { //符号反转结果栈顶数字
                    sum = -sumStack.peek();
                    sumStack.pop();
                    sumStack.add(sum);
                } else { //其他运算符拿 栈顶下一个数字 - 栈顶数字 得到新栈顶数字在入栈
                    double b = sumStack.peek();
                    sumStack.pop();
                    double a = sumStack.peek();
                    sumStack.pop();
                    switch(c) {
                        case "+":
                            sum = a+b;
                            break;
                        case "-":
                            sum = a-b;
                            break;
                        case "*":
                            sum = a*b;
                            break;
                        case "/":
                            sum = a/b;
                            break;
                    }
                    sumStack.add(sum);
                }
                currStack.pop(); //操作每一步后后缀表达式栈要弹出栈顶元素
            }
            System.out.println((int)sum);
        }
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 14:00
点赞 评论 收藏
分享
点赞 评论 收藏
分享
来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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