标签:150 const pop JS tokens push 整数 求值 stack
这是跟着代码随想录的顺序学习算法的第十三天。
以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。
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();
};
标签:150,const,pop,JS,tokens,push,整数,求值,stack 来源: https://blog.csdn.net/Jamcy123/article/details/123208049
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。