构建表达式二叉树

# -*- coding: cp936 -*-

#构建表达式二叉树

import Stack



#if 'ch' is opreator,then return True,otherwise return False

def isOperator(ch):

    if '+' == ch or '-' == ch or\

       '*' == ch or '/' == ch or\

       '(' == ch or ')' == ch or\

       '#' == ch:

        return True



    return False

#compare opt1/opt2, return 1(opt1>opt2),return 0(opt1==opt2),

#return -1(opt1<opt2)

def isOpt1ExceedOpt2(opt1,opt2):

    if '+' == opt1 or '-' == opt1:

        if '*' == opt2 or '/' == opt2 or '(' == opt2:

            return -1

        else:

            return 1

    elif '*' == opt1 or '/' == opt1:

        if '(' == opt2:

            return -1

        else:

            return 1

    elif '(' == opt1:

        if ')' == opt2:

            return 0

        else:

            return -1

    elif ')' == opt1:

        if '(' == opt2:

            return 0

        else:

            return 1

    

    elif '#' == opt1:

        return 1



def createNewInnerNode(opd1,opd2,opt):

    node = []

    node.append(opd2)

    node.append(opt)

    node.append(opd1)

    return node



def createExpBinTree(exp):

    cursor = 0



    operatorStack = Stack.Stack()

    operandStack = Stack.Stack()

    

    while cursor < len(exp):

        print '--------------------------------------------------------------------------------'

        print 'operatorStack:',

        operatorStack.printStack()

        print 'operandStack :',

        operandStack.printStack()

        if isOperator(exp[cursor]):

            if operatorStack.isEmpty():

                operatorStack.push(exp[cursor])

                cursor = cursor + 1

            else:

                flag = isOpt1ExceedOpt2(operatorStack.top(),exp[cursor])

                if 1 == flag:

                    innerNode = createNewInnerNode(operandStack.pop(),

                                                   operandStack.pop(),

                                                   operatorStack.pop())

                    operandStack.push(innerNode)

                elif 0 == flag:

                    operatorStack.pop()

                    cursor = cursor + 1

                else:

                    operatorStack.push(exp[cursor])

                    cursor = cursor + 1

        else:

            operandStack.push(list(exp[cursor]))

            cursor = cursor + 1

    print '--------------------------------------------------------------------------------'    

    return operandStack.pop()



print createExpBinTree("a+(b+c)*d-e#")

 

你可能感兴趣的:(二叉树)