#python数据结构与算法分析(第二版)#
#对每一个步骤进行深入解析
一.
首先来到Stack的功能图
def __init__(self):
self.items = [] -----初始化,先创建一个空的列表以完成接下来的stack的一系列操作
在这个stack,我们取列表的表尾为栈顶,因为后续进行压栈,出栈都可以实现O(1)的时间复杂度方便很多。
因为直接引入一个Stack的库需要去官网下载,我这里就没有下载,直接自己定义了一个栈的类,它们的操作都是相同的,不用担心。
二.创建判断优先级的键值对
import string ----引入这个库,是后序要用到ASCII码来判断token(字符)是否属于词还是符号。
这里我们创建了一个空字典--prec
后面把各操作符(这里为key-键)放入,并设定相应的值(value)。这是为后续的在栈中的操作符是否要出栈还是继续压栈进行判断。后续为详细解释。
为何将“(”---优先级为何最小?
因为遇到“(”时便可以直接把“(”压入栈。而不是执行遇到操作符的时候“(”被出栈而操作符进栈的操作
三.for遍历tokenlist,对字符(token)进行判断
对于第三行,是将传入的中序表达式以.split()-----以空格为分隔点,拆分成字符串集列表
postfixlist用来储存随后传入的操作数和操作符
opstack是一个栈,用来暂存操作符,使用其倒序性
随后遍历tokenlist:
-
遍历
tokenlist
。对于每一个token
:- 如果
token
是一个大写字母(即操作数),就将其添加到postfixlist
。 - 如果
token
是一个左括号,就将其压入opstack
。 - 如果
token
是一个右括号,就从opstack
弹出元素并添加到postfixlist
,直到遇到一个左括号。 - 如果
token
是一个运算符,就从opstack
弹出元素并添加到postfixlist
,直到遇到一个优先级更低的运算符,然后将token
压入opstack
。
- 如果
四:判断结束遍历后的opstack是否为空集,随后返回字符串类型的后缀表达式
若opstack不为空的时候,便执行while循环-----按从栈顶依次弹出栈中元素到postfixlist中
这个是按先进后出的方式弹出。
.join()-----连接在一起
这样便完成了中缀表达式转后缀表达式的转化
这个为整个源码,多操作几次,才能更好的理解
欢迎来到评论区进行讨论。