本节主要论述了中缀表达式的定义、后缀表达式的定义、中缀表达式的运算方法、后缀表达式的运算方法、中缀表达式转后缀表达式的方法、以及计算机如何实现中缀表达式转后缀表达式、计算机如何计算后缀表达式。
具体代码展示如下:
#求只带有+-*/和()的中缀表达式运算
class ExpressClass:
def __init__(self,str):
self.exp=str#中缀表达式,是一个字符串
self.postexp=[]#后缀表达式,是一个列表
def getpostexp(self):
return self.postexp
def Trans(self):#把中缀表达式转变为后缀表达式
opor=SqStack()#opor是一个栈,用来存放运算符,且在形式上符合一定的要求,用来实现后缀表达式的运算顺序
i=0
while i<len(self.exp):#要遍历完整个exp字符串
ch=self.exp[i]#ch标记每一个字符串元素
#下面是每个运算级的操作步骤
#基本上都是按照遇到某个运算符,利用while循环保证运算符的优先级从栈底到栈顶是递增的
#一般为只要不为空或者没遇到括号,就要继续进行while循环整理优先级
#被要求出栈的运算符进入postexp列表
if ch=="(":
opor.push(ch)
elif ch==")":
while not opor.empty() and opor.gettop()!="(":
e=opor.pop()
self.postexp.append(e)
opor.pop()
elif ch=="+" or ch=="-":
while not opor.empty() and opor.gettop()!="(":
e=opor.pop()
self.postexp.append(e)
opor.pop(ch)
elif ch =="*" or ch =="/":
while not opor.empty():
e=opor.gettop()
if e!="(" and (e=="*" or e=="/"):#*与/是这个代码里最大的优先级,所以只要遇到不是同一级运算优先级都可以进栈,
#只要统一优先级的就要执行出栈操作
e=opor.gettop()
self.postexp.append(e)
else:break
opor.push(ch)
else:#操作数字,主要是把字符串转变成可以运算的数字
d=''
while ch>="0" and ch<="9":#用ASCLL码检查是否为数字,并且把字符串中的连在一起的‘3’‘5’转变成一个数字35(举个例子)
d+=ch
i+=1#这里的变换是为了服务i<len(self.exp)
if i<len(self.exp):
ch=self.exp[i]#连在一起
else:
break
i-=1#这里的变换是为了服务最外层的while i<len(self.exp)
self.postexp.append(int(d))#把连好的数字加入列表
i+=1
while not opor.empty():#返回最后剩的数字
e=opor.pop()
self.postexp.append(e)
def getValue(self):#这个就是后缀表达式的运算过程,看后缀表达式的运算定义即可
opand=SqStack()
i=0
while i<len(self.postexp):
opv=self.postexp[i]
if opv=="+":
a=opand.pop()
b = opand.pop()
c=b+a
opand.push(c)
elif opv=="-":
a = opand.pop()
b = opand.pop()
c = b - a
opand.push(c)
elif opv=="*":
a = opand.pop()
b = opand.pop()
c = b * a
opand.push(c)
elif opv=="/":
a = opand.pop()
b = opand.pop()
c = b / a
opand.push(c)
else:
opand.push(opv)
i+=1
return opand.gettop()
str="(56-20)/(4+2)"
print("中缀表达式:"+str)
obj=ExpressClass(str)
obj.Trans()
print("后缀表达式:".obj.getpostexp())
print("求值结果:%g"%(obj.getValue()))