[150] 逆波兰表达式求值 js

题目描述:

给你一个字符串数组 tokens ,表示一个根据 逆波兰表示法 表示的算术表达式。

*

* 请你计算该表达式。返回一个表示表达式值的整数。
 

逆波兰表达式:

*

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

*

*

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

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

*

*

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

*

*

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

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

解题思路:

遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中

除法注意小于0向上取整,大于0向下取整

解法一:

function evalRPN(tokens) {
    let stask = [];
    for (let i = 0; i < tokens?.length; i++) {
        // 数字入栈
        if (/\d/.test(tokens[i])) {
            stask.push(+tokens[i]);
        } else {
            const secNum = stask.pop();
            const firNum = stask.pop();
            eval(
                `stask.push(${firNum} ${tokens[i]} ${secNum}  < 0 ? Math.ceil(${firNum} ${tokens[i]} ${secNum}) : Math.floor(${firNum} ${tokens[i]} ${secNum}))`,
            );
        }
    }
    return stask.pop();
};

用时:

// Your runtime beats 20.53 % of typescript submissions

// Your memory usage beats 5.27 % of typescript submissions (59.6 MB)

优化

除法的取整 实际上就是 Math.trunc 去掉小数部分

eval(`stask.push(Math.trunc(${firNum} ${tokens[i]} ${secNum}))`)

你可能感兴趣的:(算法,leetcode,javascript)