python 小括号 运算_python 二叉树实现带括号的四则运算

本文介绍了一种使用Python实现带括号的四则运算的方法,通过构建二叉树来处理运算符的优先级。首先,定义了获取运算符优先级的函数getLev,然后通过makeTree函数递归构建运算表达式树。最后,通过getTree和calc函数分别获取运算树并进行计算。示例中给出了如何处理表达式'20-5*(0+1)*5^(6-2^2)'的运算过程。
摘要由CSDN通过智能技术生成

#!/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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值