LeetCode之EvaluateReversePolishNotation

本文介绍了一种使用栈来解决逆波兰表达式求值问题的方法。通过遍历字符串数组,遇到数字则压栈,遇到操作符则从栈中取出最近的两个数字进行运算,并将结果重新压入栈中。最终栈顶的元素即为表达式的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

/**
 * 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
 */

这个问题之前面试刚刚遇见过。其实上面的英文描述不用看,单看给的例子就大致明白了。一个字符串数组里面,如果有操作符,那么操作符优先与它左边的两个数进行操作运算,再把结果放入其中。依次类推。看到这里,可以想到借助栈stack可以完美解决这个问题。一开始先把数字压入栈,遇见操作符“+”“-”“*”“/”以后,连续弹出两个数,进行运算,然后再把结果压入栈,然后再进行压栈操作。具体代码如下:

public int evalRPN(String[] tokens) {
        Stack<Integer> st = new Stack<Integer>();
        int size = tokens.length;
        for (int i = 0; i < size; i++) {
            if (isDigital(tokens[i])) {//遇见数字则压入
                st.push(Integer.parseInt(tokens[i]));
            } else {//遇见操作符,弹出两个数字进行运算,再将结果压入栈
                st.push(calc(st.pop(), st.pop(), tokens[i]));
            }
        }
        return st.pop();
    }

    private Integer calc(Integer num2, Integer num1, String op) {
        switch (op.charAt(0)) {
        case '+':
            return num1 + num2;
        case '-':
            return num1 - num2;
        case '*':
            return num1 * num2;
        case '/':
            return num1 / num2;
        default:
            return 0;
        }
    }

    private boolean isDigital(String s) {//判断压入的是数字还是操作符
        try {
            Integer.parseInt(s);
        } catch (NumberFormatException e) {
            return false;
        }
        return true;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值