题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/
1.问题理解
逆波兰表达式是一种后缀表达式,特点就是将运算符置于操作数之后,从而无需括号就能明确运算顺序,例如:
中缀表达式(2+1)*3 对应的逆波兰表达式为["2", "1" , "+" , "3" , "*"]
2.核心算法:栈
1.初始化空栈:用于存储操作数
2.遍历表达式:
遇到数字,加入栈中
遇到运算符:弹出栈顶两个元素,按运算符计算,将结果压回栈中
3.返回结果:遍历结束后,栈中唯一的元素即为最终结果
示例解析:
输入:tokens = ["4","13","5","/","+"]
输出:6
解释:该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6压入4,13,5到栈中,遇到/ 弹出5,13 ,计算 13 / 5 = 2 ->压入2 到栈中,遇到+ ->弹出 2 和 4,计算 4 + 2 = 6
3.关键点和边界条件
除法处理:Python 中
/是浮点除法,需用int(x/y)或//实现向零截断(如6 / -132 = -0.045... → 0)同时 python 默认// 为向下整除(负无穷方向),比如 6 // -132 = -1 ,所以需要再特殊处理负数向 0 取整负数处理:需正确解析负数字符串(如
"-11")操作数顺序:减法和除法需区分左右操作数(如
b - a而非a - b)
from operator import add,sub,mul
# 正负号整除的两种情况
def div(x,y):
return int(x/y) if x*y >0 else -(abs(x) // abs(y))
class Solution:
op_map = {'+':add,'-':sub,'*':mul,'/':div}
def evalRPN(self, tokens: List[str]) -> int:
stack = []
for token in tokens:
if token not in {'+','-','*','/'}:
stack.append(int(token))
else:
op2 = stack.pop()
op1 = stack.pop()
stack.append(self.op_map[token](op1,op2))
return stack.pop()