Leetcode刷题计划 第二十七天 150. 逆波兰表达式求值

文章介绍了逆波兰表达式的基本概念,它是一种无括号且无歧义的表达方式,适合栈操作。提供了一种解决方案,遍历表达式,遇到数字存栈,遇到运算符则进行计算并将结果压栈,最终栈顶元素即为运算结果。代码示例展示了如何处理加、减、乘、除四种运算。

在解决此问题之前,我先为大家介绍一下什么是逆波兰表达式:

逆波兰表达式,是一种后缀表达式,所谓后缀就是指运算符写在后面。

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。

该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。

逆波兰表达式主要有以下两个优点:

1、去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。

2、适合用栈操作运算:遇到数字则入栈;遇到运算符则取出栈顶两个数字进行计算,并将结果压入栈中。

       在介绍完逆波兰表达式后,我们就要来解决这个问题了。在做这道题的时候,我们依然可以从上一道题----“1047. 删除字符串中的所有相邻重复项”中得到启发,这道题中我们需要把运算符前面的两个数字进行运算,再将运算结果保留并进行后面的运算,这也是一个消除的过程,只不过在消除过后我们还需要把运算结果再保存回去,具体解法如下:

       在遍历整个表达式的过程中,遇到数字就将其存入栈中,遇到运算符就从栈中弹出两个数据根据此运算符进行计算再将计算结果存入栈中,最后栈中的数据就是整个表达式的运算结果,具体代码如下:

class Solution {
    public int evalRPN(String[] tokens) {
        Stack<Integer> sta = new Stack<>();
        int sum = 0;
        for(int i = 0; i < tokens.length; i++) {
            if(!tokens[i].equals("+") && !tokens[i].equals("-") && !tokens[i].equals("*") && !tokens[i].equals("/")) {
                sta.push(Integer.valueOf(tokens[i]));
            } else {
                if(tokens[i].equals("+")) {
                    sta.push(sta.pop() + sta.pop());
                } else if(tokens[i].equals("-")) {
                    int a = sta.pop();
                    int b = sta.pop();
                    sta.push(b - a);
                } else if(tokens[i].equals("*")) {
                    sta.push(sta.pop() * sta.pop());
                } else if(tokens[i].equals("/")) {
                    int a = sta.pop();
                    int b = sta.pop();
                    sta.push(b / a);
                }
            }
        }
        return sta.pop();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值