# 思路:
# 1.中缀表达式转换为全括号形式
# 2.将所有的操作符移动到子表达式所在的左括号(前缀)或者右括号(后缀)处并替代之
# 3.再删除所有的括号
# ❖在中缀表达式转换为后缀形式的处理过程中,操作符比操作数要晚输出
# 所以在扫描到对应的第二个操作数之前,需要把操作符先保存起来(栈)
# ❖而这些暂存的操作符,由于优先级的规则,还有可能要反转次序输出。
# 在A+B*C中,+虽然先出现,但优先级比后面这个*要低,所以它要等*处理完后,才能再处理。
# ❖这种反转特性,使得我们考虑用栈来保存暂时未处理的操作符
# ❖总结下,在从左到右扫描逐个字符扫描中缀表达式的过程中,采用一个栈来暂存未处理的操作符
# ❖这样,栈顶的操作符就是最近暂存进去的,当遇到一个新的操作符,就需要跟栈顶的操作符比较下优先级,再行处理。
import string
def convert(unfixstr):
opstack = []
postfixlist = []
prec = {}
prec['('] = 0
prec['*'] = 2
prec['/'] = 2
prec['+'] = 1
prec['-'] = 1
tokenlist = unfixstr.split(' ')
for token in tokenlist:
if token in string.ascii_uppercase:
postfixlist.append(token)
elif token == '(':
opstack.append(token)
elif token == ')':
toptoken = opstack.pop()
while toptoken != '(':
postfixlist.append(toptoken)
toptoken = opstack.pop()
else:
while opstack != [] and (prec[opstack[-1]] >= prec[token]):
postfixlist.append(opstack.pop())
opstack.append(token)
while opstack:
postfixlist.append(opstack.pop())
return ''.join(postfixlist)
print(convert('( A * B ) + ( C * D )'))
# 后缀表达式求值:
# 对于一个后序表达式,应先用一个空栈暂存操作数,同时后入栈的操作符应先计算(每个操作符只对离他最近的两个操作数进行运算)
def output(postfixstr):
outputstack = []
def calculate(input1,input2,op):
if op == '+':
return input1 + input2
if op == '-':
return input1 - input2
if op == '*':
return input1 * input2
if op == '/':
return input1 / input2
postfixlist = postfixstr.split(' ')
for token in postfixlist:
if token in '1234567890':
outputstack.append(token)
elif token in '+-*/':
input1 = outputstack.pop()
input2 = outputstack.pop()
temp = calculate(int(input2), int(input1), token)
outputstack.insert(0, temp)
return outputstack[0]
print(output('1 2 * 3 4 * +'))
2021.3.13 栈学习
最新推荐文章于 2025-12-03 12:28:21 发布
本文介绍了一种算法,用于将中缀表达式转换为后缀表达式,并提供了具体的Python实现代码。此外,还详细解释了算法背后的原理,包括使用栈来存储操作符的方法及其在处理操作符优先级时的作用。
3074

被折叠的 条评论
为什么被折叠?



