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()

  

原文地址:https://www.cnblogs.com/zhj11226/p/6172164.html