题解 | #表达式求值#

表达式求值

http://www.nowcoder.com/practice/9566499a2e1546c0a257e885dfdbf30d

class HelloWorld {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
//        优先级运算符
        Map<Character, Integer> map = new HashMap<>();
        map.put('+', 1);
        map.put('-', 1);
        map.put('/', 2);
        map.put('*', 2);
//        预处理字符串
        s = s.replace("(-", "(0-").replace("(+", "(0+").replace(" ", "");
        if (s.charAt(0) == '-') s = '0' + s;

        Stack<Character> op = new Stack<>();
        Stack<Integer> nums = new Stack<>();
        char[] chars = s.toCharArray();
        //        3*5+8-0*3-6+0+0  3+(2*3)-6+(3*2)
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '(') {// 遇到左括号直接压入运算符栈
                op.push(chars[i]);
            } else if (chars[i] == ')') {// 遇到有括号  当运算符栈顶不是左括号时 计算 结束后弹出()->
                while (!op.isEmpty() && op.peek() != '(') {
                    calc(nums, op);
                }
                op.pop();
            } else {
//                数字
                if (Character.isDigit(chars[i])) {// 遇到数字压入栈
                    int j = 0, k = i;
                    while (k < chars.length && Character.isDigit(chars[k])) {   // 123+233+...
                        j = j * 10 + (chars[k] - '0');
                        k++;
                    }
                    i = k - 1;
                    nums.push(j);
                } else {
                  //遇到运算符 当栈顶不是左括号时 && 满足优先级时 =>计算 结束后压入运算符
                    while (!op.isEmpty() && op.peek() != '('  
                            && (map.get(op.peek()) >= map.get(chars[i]))) {
                        calc(nums, op);
                    }
                    op.push(chars[i]);
                }
            }

        }
        while (!op.isEmpty()) {//当运算符栈不为空  计算
            calc(nums, op);
        }

        System.out.println(nums.peek()); 
    }
  
      private static void calc(Stack<Integer> nums, Stack<Character> op) {
        if (op.isEmpty()) {
            return;
        }
        if (nums.isEmpty() || nums.size() < 2) {
            return;
        }
//        0-1+(0-1*5+2)
        char pop = op.pop();
        Integer pop2 = nums.pop();
        Integer pop1 = nums.pop();

        switch (pop) {
            case '+':
                nums.push(pop1 + pop2);
                break;
            case '-':
                nums.push(pop1 - pop2);
                break;
            case '*':
                nums.push(pop1 * pop2);
                break;
            case '/':
                nums.push(pop1 / pop2);
                break;
        }

    }
}
全部评论

相关推荐

02-19 12:50
黑龙江大学 Java
点赞 评论 收藏
分享
浪子陪都:简历最优秀的地方放到了后面,国奖,校级奖学金这些是最亮眼的。说明你跟同级别的学生不一样。 建议台灯这个,PCB布局布线这个词汇不专业,业内是PCB Layout,第二,单片机的板子一般不用考虑SI,PI 都是低速信号,只要遵循3W原则就好了。 单片机的项目太low了,技能这块,你要看一下BOSS直聘的招聘要求,按照别人的要求写,一些关键词可以增加你简历被检索到的概率。 主修课程不用写,这个没有人去关注的。
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务