复习实习数据结构:
实现逆波兰式其实搞懂里面的规则就很简单的了。
树的遍历:前序:根左右。中序:左根右。后序:左右根
直接上代码
import operator
opMap = {'+':operator.add,'-':operator.sub,"/":operator.truediv,"*":operator.mul}
proMap = {'(':100,'+':3,'-':3,'*':8,'/':8,')':1,'#':0}
#获取下个操作数
def getNext(leftExpress):
t = leftExpress[0:1]
if t.isnumeric():
for s in leftExpress[1:]:
if not s.isnumeric():
break
else:
t += s
return t
else:
return t
def popStack():
while opStack[-1] != '(':
nStack.append(opStack.pop())
opStack.pop()
def popStack2(s):
pro1 = proMap[s]
for i in range(len(opStack)):
op = opStack[-1]
if op == '(':
opStack.append(s)
break
else:
pro0 = proMap[op]
if pro0 < pro1:
opStack.append(s)
break
else:
nStack.append(opStack.pop())
def calculate():
num = len(nStack)
i = 0
while num > 1:
c = nStack[i]
if not c.isnumeric():
x = nStack[i-1]
y = nStack[i-2]
res = opMap.get(c)(int(x),int(y))
nStack[i] = str(res)
nStack.remove(x)
nStack.remove(y)
i = 0
else:
i+=1
num = len(nStack)
return nStack.pop()
def dealwith(s):
if s.isnumeric():
nStack.append(s)
elif s == '(':
opStack.append(s)
elif s == ')':
popStack()
elif opStack[-1] == '(':
opStack.append(s)
else:
op = opStack[-1]
pro0 = proMap[op]
pro1 = proMap[s]
if pro1 > pro0:
opStack.append(s)
else:
popStack2(s)
def meger():
while len(opStack) > 1:
nStack.append(opStack.pop())
express = '9+2*3'
opStack = ['#']
nStack = []
def run():
i = 0
l = len(express)
while i < l:
token = getNext(express[i:])
dealwith(token)
i+=len(token)
meger()
print(nStack)
print(calculate())
if __name__ == '__main__':
run()