python 二叉树实现带括号的四则运算
#!/usr/bin/python #* encoding=utf-8 s = "20-5*(0+1)*5^(6-2^2)" c = 0 top = [0,s[c],0] op = [["0","1","2","3","4","5","6","7","8","9"],["+","-"],["*","/"],["^"]] def getLev(ch): for c1 in range(0, len(op)): for c2 in range(0, len(op[c1])): if (op[c1][c2]==ch): return c1 elif (len(ch)>1): match = 0 for c3 in range(0, len(ch)): if (getLev(ch[c3])>=0): match+=1 if (match==len(ch)):return c1 return -1 def makeTree(root): global c global s c += 1 if (c>=len(s)): return root if (s[c]=="("): c+=1 node = [0, s[c], 0] node = makeTree(node) elif (s[c]==")"): return root else: node=[0, s[c], 0] levRoot = getLev(root[1]) levCur = getLev(node[1]) print levRoot, levCur, root[1], node[1] if (levCur>=levRoot): if ((levRoot==0 and levCur!=levRoot) or (levRoot!=0 and levCur==levRoot)): node[0] = root root = node return makeTree(root) elif (levRoot==0 and levCur==0): root[1] += node[1] return makeTree(root) else: node[0] = root[2] root[2] = makeTree(node) return makeTree(root) else: if (levCur==0 or node[0]!=0): root[2] = node return makeTree(root) else: c-=1 return root top = makeTree(top) #print top def getTree(node): ret = [] if (node[0]!=0): _tmp = getTree(node[0]) for c in range(0, len(_tmp)): ret.append(_tmp[c]) if (node[2]!=0): _tmp = getTree(node[2]) for c in range(0, len(_tmp)): ret.append(_tmp[c]) ret.append(node[1]) return ret exp = getTree(top) print exp def calc(): stack=[] for c in range(0, len(exp)): if (exp[c]>='0' and exp[c]<='9'): stack.append(exp[c]) else: op = exp[c] n2 = stack.pop() n1 = stack.pop() if (op!="^"): v = n1+op+n2 else: v = "pow(%s,%s)"%(n1,n2) print v, eval(v) stack.append("%s"%eval(v)) return stack.pop() print calc()