栈 与队列

 逆波兰表达式求值:

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

如动画所示: 

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

你可能感兴趣的:(python,开发语言)