計算四則運(yùn)算:
import ninth lesson_Tree
def build_parse_Tree(alist):
alst = alist.split()
# 創(chuàng)建一個節(jié)點(diǎn)棧
astack = []
res_Tree = BinaryTree('')
astack.append(res_Tree)
currentTree = res_Tree
for i in alst:
# 如果是'(',則創(chuàng)建左子節(jié)點(diǎn),并把該父節(jié)點(diǎn)記錄入棧,再把指針指向左子節(jié)點(diǎn)
if i == '(':
currentTree.insertLeft('')
astack.append(currentTree)
currentTree = currentTree.getLeftChildren()
# 如果是數(shù)字,則給節(jié)點(diǎn)賦值,并把父節(jié)點(diǎn)出棧,再把指針指向父節(jié)點(diǎn)
elif i is not in ['+', '-', '*', '/']:
currentTree.setVal(int(i))
currentTree = astack.pop()
# 如果是符號,則給節(jié)點(diǎn)賦值符號,并把該節(jié)點(diǎn)入棧,并創(chuàng)建右子節(jié)點(diǎn),再把指針指向右子節(jié)點(diǎn)
elif i in ['+', '-', '*', '/']:
currentTree.setVal(i)
currentTree.insertRight('')
astack.append(currentTree)
currentTree = currentTree.getRightChildren()
# 如果是')',則返回上一節(jié)點(diǎn),即將棧壓出上一節(jié)點(diǎn)
elif i == ')':
currentTree = astack.pop()
else:
raise ValueError
return res_Tree
# 遞歸調(diào)用,基本結(jié)束條件為節(jié)點(diǎn)為葉節(jié)點(diǎn),返回葉節(jié)點(diǎn)的值進(jìn)行計算
def evaluate(res_Tree):
opers = {'+': operator.add(), '-': operator.sub(), '*': operator.mul(), '/': operator.truediv()}
left = res_Tree.getLeftChildren()
right = res_Tree.getRightChildren()
if left and right:
fn = opers[res_Tree.getRootVal()]
return fn(evaluate(left),evaluate(right))
else:
return res_Tree.getRootVal()