中缀表达式转后缀表达式并计算
Posted 除了心跳都忘掉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中缀表达式转后缀表达式并计算相关的知识,希望对你有一定的参考价值。
中缀表达式转换为后缀表达式的算法
- 初始化一个空的后缀表达式和一个空的栈。
- 从左到右扫描中缀表达式。
- 遇到一个运算数的时候,将其添加到后缀表达式的后面。
- 遇到一个左括号的时候,将其压入栈中。
- 遇到一个运算符,从栈中弹出和它具有相等的或更高优先级的所有运算符,将它们添加到后缀表达式的末尾,然后,将扫描到的运算符压入栈中。
- 遇到一个右括号的时候,将运算符从栈中弹出并添加到后缀表达式中,直到遇到了与之匹配的左括号,并将其(两个括号)丢弃。
- 遇到中缀表达式结束的时候,将栈中剩下的运算符都转移到后缀表达式之中。
计算后缀表达式
- 从左到右地遍历表达式
- 遇到一个运算符的时候,对之前的两个运算数应用该运算符,并且用结果替换这两个运算数和这个运算符。
- 继续遍历,直到到达了表达式的末尾,此时,只剩下了表达式的值。
三个函数
1.stringToList()
将输入的字符串转化为列表;
'33-15*6'
转化为
['33', '-', '15', '*', '6']
2.infixToSuffix()
中缀表达式转为后缀表达式;
['33', '-', '15', '*', '6']
转化为
['33', '15', '6', '*', '-']
3.calcuSuffix()
计算后缀表达式;
易错点
1.stringToList()中,
我的思想是在遇到一个非数字的字符时就将 tempL 加入到 result 并将其清空;
这里要注意表达式的最后可能不是非数字字符,即最后一遍的时候 tempL 可能不会执行添加到 result 中的操作,所以在循环结束后还要检查如果 tempL 不为空,就要将它加入到 result 中。
2.infixToSuffix()中,
在每次使用peek()探查栈顶元素时,应先判断栈是否为空。否则会引发异常。
代码
from linkedstack import LinkedStack
def stringToList(exp):
tempL = []
result = []
for ch in exp:
if str(ch).isdigit():
tempL.append(ch)
else:
if tempL:
result.append(''.join(tempL))
tempL.clear()
result.append(ch)
if tempL:
result.append(''.join(tempL))
return result
def infixToSuffix(lyst):
suffix = []
stk = LinkedStack()
for token in lyst:
if str(token).isdigit():
suffix.append(token)
else:
if token in ['(', '[']:
stk.push(token)
elif token in [')', ']']:
top = stk.peek()
while not top in ['(', '[']:
suffix.append(top)
stk.pop()
top = stk.peek()
stk.pop()
else:
if stk.isEmpty():
stk.push(token)
elif token in ['+', '-']:
top = stk.peek()
while top in ['+', '-', '*', '/']:
suffix.append(top)
stk.pop()
if stk.isEmpty():
break
else:
top = stk.peek()
stk.push(token)
elif token in ['*', '/']:
top = stk.peek()
while top in ['*', '/']:
suffix.append(top)
stk.pop()
if stk.isEmpty():
break
else:
top = stk.peek()
stk.push(token)
while not stk.isEmpty():
suffix.append(stk.pop())
return suffix
def calcuSuffix(lyst):
# every element in lyst should be a string.
tempS = ''
while len(lyst) != 1:
for i in range(len(lyst)):
if lyst[i] in ['+', '-', '*', '/']:
tempS += lyst[i - 2] + lyst[i] + lyst[i - 1]
lyst[i - 2] = str(eval(tempS))
tempS = ''
for j in range(i - 1, len(lyst) - 2):
lyst[j] = lyst[j + 2]
del lyst[-1:-3:-1]
break
return lyst[0]
def main():
while True:
st = input('Input an arithmetic expression:\\n')
if st == 'exit':
break
lyst = stringToList(st)
suff = infixToSuffix(lyst)
result = calcuSuffix(suff)
print('Suffix expression of it is:', suff, sep='\\n')
print('Result of the expression:', result, sep='\\n')
if __name__ == '__main__':
main()
以上是关于中缀表达式转后缀表达式并计算的主要内容,如果未能解决你的问题,请参考以下文章