计算器原理(求只带有+-*/和()的中缀表达式运算)(图解)

本节主要论述了中缀表达式的定义、后缀表达式的定义、中缀表达式的运算方法、后缀表达式的运算方法、中缀表达式转后缀表达式的方法、以及计算机如何实现中缀表达式转后缀表达式、计算机如何计算后缀表达式。

具体代码展示如下:

#求只带有+-*/和()的中缀表达式运算
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()))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

踏歌~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值