【JS力扣刷题笔记】150. 逆波兰表达式求值

这是跟着代码随想录的顺序学习算法的第十三天。

以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。


150. 逆波兰表达式求值

参考相关链接:

150. 逆波兰表达式求值

代码随想录

二进制位运算符


笔记

逆波兰表达式在学习离散数学的时候接触过,算法实现不难,但每次看代码随想录的 JS 版本都得顿一会去理解一下大佬的简洁写法。

里面有行代码没看懂就去搜了一下,链接放这了,是阮一峰老师的教程

二进制位运算符

"有一点需要特别注意,位运算符只对整数起作用,如果一个运算子不是整数,会自动转为整数后再执行。另外,虽然在 JavaScript 内部,数值都是以64位浮点数的形式储存,但是做位运算的时候,是以32位带符号的整数进行运算的,并且返回值也是一个32位带符号的整数。

i = i | 0;

上面这行代码的意思,就是i(不管是整数或小数)转为32位整数"

去idea上做了简单的测试:

console.log(-6.2 | 0); // -6
console.log(-1.7 | 0); // -1
console.log(5.1 | 0); // 5
console.log(3.7 | 0); // 3

题解代码:

// 自己做的
var evalRPN = function(tokens) {
    if(tokens.length === 1) return tokens;
    const stack = [];
    for(const x of tokens){
            switch(x) {
                case '+':
                stack.push(stack.pop() + stack.pop());
                    break;
                case '-':
                    stack.push(-stack.pop() + stack.pop());
                    break;
                case '*':
                stack.push(stack.pop() * stack.pop());
                    break;
                case '/':
                const first = stack.pop();
                const second = stack.pop();
                let res = second / first;
                // 对除法的结果进行取整处理
                stack.push(res > 0 ? Math.floor(res) : Math.ceil(res));
                    break;
                // 不是符号就正常输入,转化成数字
                default : stack.push(parseInt(x));
        }
    }
    return stack[0];
};

(膜拜大佬)

// 代码随想录JS版本
var evalRPN = function(tokens) {
    const s = new Map([
        ["+", (a, b) => a * 1  + b * 1],
        ["-", (a, b) => b - a],
        ["*", (a, b) => b * a],
        ["/", (a, b) => (b / a) | 0] // 二进制位运算符
    ]);
    const stack = [];
    for (const i of tokens) {
        if(!s.has(i)) {
            stack.push(i);
            continue;
        }
        stack.push(s.get(i)(stack.pop(),stack.pop()))
    }
    return stack.pop();
};
上一篇:用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?


下一篇:用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?