# -*- 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#")