逆波兰表达式求值:
需要实现后缀表达式的功能如下图所示:
如动画所示:
class Solution://定义一个类
def evalRPN(self, tokens: List[str]) -> int://定义一个方法,接受一个名为tokens的字符串列表,返回一个整数。
stack=[]//初始化一个空栈,用于进行后缀表达式计算
for item in tokens://遍历列表的每一个元素。
if item not in {"+","-","*","/"}://如果列表的元素不是符号,则进栈
stack.append(item)//进栈操作
else:
first_number=stack.pop()//摘除的第一个元素,进行后缀表达式的第一个元素
second_number=stack.pop()//摘除的地二个元素,进行后缀表达式的第二个元素
stack.append(int(eval(f'{second_number}{item}{first_number}'))
)//先用f-string进行字符串化,利用eval进行计算,利用int整数化,最后在stack中插入该元素。
return int(stack.pop())//返回的最后一个元素就是答案。
需要注意的一点就是后缀表达式不需要考虑符号优先级,譬如
4 + 13 / 5,这就是中缀表达式,计算机从左到右去扫描的话,扫到13,还要判断13后面是什么运算符,还要比较一下优先级,然后13还和后面的5做运算,做完运算之后,还要向前回退到 4 的位置,继续做加法,你说麻不麻烦!
那么将中缀表达式,转化为后缀表达式之后:["4", "13", "5", "/", "+"] ,就不一样了,计算机可以利用栈来顺序处理,不需要考虑优先级了。也不用回退了, 所以后缀表达式对计算机来说是非常友好的
伪代码:1.首先接受一个列表,里面装满了数字和符号,
2.创建一个空栈,这里主要是利用了栈的特性先进后出。就避免了优先级的考虑,减化了复杂度。
3.利用for循环遍历每一个元素,再利用if条件语句来判断,该元素是否是符号,如果不是则装进stack,else:利用stack.pop()摘除stack的最后两个元素进行运算。
4.遍历结束以后则可以返回stack的最后一个字符。