LeetCode150.逆波兰表达式求值

381 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

逆波兰表达式求值

根据 逆波兰表示法,求表达式的值。

有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。

说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。

image.png

image.png

逆波兰表达式:

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

平常使用的算式则是一种中缀表达式,如 ( 1 + 2 ) * ( 3 + 4 ) 。 该算式的逆波兰表达式写法为 ( ( 1 2 + ) ( 3 4 + ) * ) 。 逆波兰表达式主要有以下两个优点:

去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。 适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ev… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法

逆波兰表达式是是使用栈解决的经典问题,首先我们需要考虑数字和运算符两种情况。如果是数字就正常压入栈中,如果是运算符,就把栈顶两个元素弹出,然后根据运算符以相应的规则进行运算,然后将运算结果压入栈中,一直重复以上操作,知道表达式全部处理完成,弹出运算结果。这个过程里,我们可以使用Map存储运算符对应操作,也可以直接用if比较运算符使用对应操作,最后还要注意除法运算只保留整数部分

var evalRPN = function(tokens) {
    const stack = [];
    const s = new Map([
        ["+",(a,b)=> a * 1 + b * 1],
        ["-",(a,b)=> b - a],
        ["*",(a,b)=> a * b],
        ["/", (a, b) => (b / a) | 0]
    ]);
    for(const x of tokens) {
        if (!s.has(x)) {
            stack.push(x);
            continue;
        }
        stack.push(s.get(x)(stack.pop(),stack.pop()))
    }
    return stack.pop();
};