「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
逆波兰表达式求值
根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。
逆波兰表达式:
逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。
平常使用的算式则是一种中缀表达式,如 ( 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();
};