[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}))`)

  • 16
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值