栈 与队列

本文介绍了一种使用栈实现后缀表达式求值的方法,通过将中缀表达式转换为后缀表达式,简化了计算机处理过程,无需考虑运算符优先级。算法通过遍历并判断元素类型,利用栈的特性进行高效计算。
摘要由CSDN通过智能技术生成

 逆波兰表达式求值:

需要实现后缀表达式的功能如下图所示:

如动画所示: 

150.逆波兰表达式求值

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的最后一个字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值