zoukankan      html  css  js  c++  java
  • 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()
    

      

  • 相关阅读:
    caffe BUG
    Ubuntu安装低版本gcc
    OpenCV的CV :: findHomography运行时错误
    opencv中使用 SURF算法匹配的遇到的问题
    C++ 类中特殊的成员变量(常变量、引用、静态)的初始化方法 --转
    SIFI与surf
    opencv复习
    opencv老版本的IplImage使用
    python学习笔记-对象持久化保存与恢复
    Styles and Themes
  • 原文地址:https://www.cnblogs.com/zhj11226/p/6172164.html
Copyright © 2011-2022 走看看