[LeetCode]150.Evaluate Reverse Polish Notation

Evaluate the value of an arithmetic expression in Reverse Polish Notation.

Valid operators are +-*/. Each operand may be an integer or another expression.

Some examples:

  ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9
  ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6

解题思路: 不用被他的名字吓唬到,这个表达式的意思是当碰到计算符时,计算之前出现的两个数字。有人说,那计算出来的数字放哪儿,这当然就是这道题目的考点了,就是采用什么样的数据结构,那么我们看到这道题目说操作的是前面两个字符,如果我们只用题目给的数组和指针来进行操作的话,就没有办法记录之前已经操作的字符和数字了,而且如果用这个方法代码量会非常大,所以我这里用了栈作为数据结构。为什么用栈?因为栈是先进后出,正好我们碰到操作符的时候是进行前面两个数字的操作,那样就能省去我们用多个指针记录当前index或者是用一个变量来记录之前计算的值。代码如下:

public class Solution {
    public int evalRPN(String[] tokens) {
        if(tokens == null || tokens.length == 0){
            return 0;
        }
<span style="white-space:pre">	</span>//用deque是因为deque查询和retrive 的时间更少
        Deque<Integer> stack = new LinkedList<>();
        
        for(int i = 0; i < tokens.length; i++){
            switch (tokens[i]){
                case "+":
                    stack.offerLast(stack.pollLast() + stack.pollLast());
                    break;
                case "-":
                    int a = stack.pollLast();
                    int b = stack.pollLast();
                    stack.offerLast(b - a);
                    break;
                case "*":
                    stack.offerLast(stack.pollLast() * stack.pollLast());
                    break;
                case "/":
                    int c = stack.pollLast();
                    int d = stack.pollLast();
                    stack.offerLast(d / c); 
                    break;
                default:
                    stack.offerLast(Integer.parseInt(tokens[i]));
                    break;
            }
        }
        return stack.pollLast();
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值