中缀转后缀
import queue
#判断符号优先符
def compareII(a,b):
if (a=='+' or a=='-') and (b=='*' or b=='/'):
return 0
elif a=='(' or b=='(':
return 0
return 1
#中缀变后缀
# 1)一个数字栈
# 2)一个符号栈
# 3)判断符号的优先级
# 4)数字栈跳到符号栈
# 5)输出符号栈
def show(line):
opStack = []
rsList = []
for i in line:
p = None
if i in ['0','1','2','3','4','5','6','7','8','9']:
rsList.append(i)
else:
if not opStack:
p = i
opStack.append(i)
continue
else:
p = opStack[len(opStack)-1]
if compareII(p,i):
while opStack and compareII(p,i):
if opStack:
p = opStack[len(opStack)-1]
o = opStack.pop()
if o!='(' and o!=')':
rsList.append(o)
if not opStack:
opStack.append(i)
else:
opStack.append(i)
print(rsList)
#计算结果
def calculate(line):
opStack = []
rsList = []
for i in line:
p = None
if i in ['0','1','2','3','4','5','6','7','8','9']:
rsList.append(i)
else:
if not opStack:
p = i
opStack.append(i)
continue
else:
p = opStack[len(opStack)-1]
if compareII(p,i):
while opStack and compareII(p,i):
if opStack:
p = opStack[len(opStack)-1]
o = opStack.pop()
if o!='(' and o!=')':
if o=='+' and rsList:
rsList.append(int(rsList.pop())+int(rsList.pop()))
elif o=='-' and rsList:
a = int(rsList.pop())
b = int(rsList.pop())
rsList.append(b-a)
elif o=='*' and rsList:
rsList.append(int(rsList.pop())*int(rsList.pop()))
elif o=='/' and rsList:
a = int(rsList.pop())
b = int(rsList.pop())
rsList.append(b / a)
if not opStack:
opStack.append(i)
else:
opStack.append(i)
print(rsList)
if __name__ == '__main__':
line = '(3+4)*5+7-(2+1)*9='
show(line)
calculate(line)
运算截图: