LeetCode:逆波兰表达式求值

345 阅读1分钟

一、题目描述

二、思路分析

2.1 分析

本题其实已经把解题思路说明白了,值得注意的是减法和除法中运算的两个数的前后位置。对于给定的逆波兰表达式,例如:["4", "13", "5", "/", "+"]。遍历该逆波兰表达式,遇到数字,直接入栈,栈内现在元素为[4, 13, 5]。当遇到运算符"/"时,取出栈顶的两个元素,分别是 5 和 13,**将 13 / 5 ** 即 2 结果放回栈内。遇到运算符"+",取出栈顶的两个元素,分别是 2 和 4,将 2 + 4 即 6 结果放回栈。此时表达式遍历完毕,返回栈内元素,即结果。

2.2 图解

三、题解

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();

        for (String token : tokens) {
            switch (token) {
                // 遇到 + - * / 将栈内的数字出栈两个,计算结果,放回栈中(注意一下 - / 的运算顺序)
                case "+":
                    stack.push(stack.pop() + stack.pop());
                    break;
                    
                // 减法注意运算顺序
                case "-":
                    int num2 = stack.pop();
                    stack.push(stack.pop() - num2);
                    break;
                    
                case "*":
                    stack.push(stack.pop() * stack.pop());
                    break;
                    
                // 除法注意运算顺序
                case "/":
                    int divisor = stack.pop();
                    stack.push(stack.pop() / divisor);
                    break;
                    
                // 遇到数字直接入栈
                default:
                    stack.push(Integer.parseInt(token));
            }
        }
        // 剩下在栈的就是结果啦
        return stack.pop();
    }
}