LeetCode精选TOP面试题150.逆波兰表达式求值

题目描述

  • 根据 逆波兰表示法,求表达式的值。
  • 有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
  • 整数除法只保留整数部分。
  • 给定逆波兰表达式总是有效的。即表达式总会得出有效数值且不存在除数为 0 的情况。
example
input  : tokens = {"2","1","+","3","*"}
output : 9
note   : 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9
input  : tokens = {"4","13","5","/","+"}
output : 6
note   : 该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6
input  : tokens = {"10","6","9","3","+","-11","*","/","*","17","+","5","+"}
output : 22
note   : 该算式转化为常见的中缀算术表达式为:((10 * (6 / ((9 + 3) * -11))) + 17) + 5

解题思路

思路:栈

  • 遇到数字之间压入栈中
  • 遇到运算符 OP,依次取栈顶两个元素Before、After
  • 然后根据 OP 完成运算,得到结果 R 重新压入栈顶
    • 需要注意的是减法操作时为 B - A,除法操作时为B / A,顺序不能颠倒
  • 结果返回栈顶元素
  • 好处:不会破坏原字符串数组
  • 时间复杂度O(n)
  • 空间复杂度O(n)

代码(Java)

public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        for (String s : tokens) {
            if (s.equals("+")) {
                stack.push(stack.pop() + stack.pop());
            } else if (s.equals("-")) {
                int after = stack.pop();
                int before = stack.pop();
                stack.push(before - after);
            } else if (s.equals("*")) {
                stack.push(stack.pop() * stack.pop());
            } else if (s.equals("/")) {
                int after = stack.pop();
                int before = stack.pop();
                stack.push(before / after);
            } else {
                stack.push(Integer.valueOf(s));
            }
        }
        return stack.pop();
    }
}

/**
 * 美化一下
 */
public class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> stack = new Stack<>();
        List<String> ops = Arrays.asList("+", "-", "*", "/");
        for (String s : tokens) {
            if (ops.contains(s)) {
                stack.push(calculate(s, stack.pop(), stack.pop()));
            } else {
                stack.push(Integer.valueOf(s));
            }
        }
        return stack.pop();
    }

    private int calculate(String op, int x, int y) {
        switch (op){
            case "+" :
                return y + x;
            case "-":
                return y - x;
            case "*" :
                return y * x;
            case "/":
                return y / x;
        }
        return 0;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值