python 实现逆波兰式

复习实习数据结构:

      实现逆波兰式其实搞懂里面的规则就很简单的了。

树的遍历:前序:根左右。中序:左根右。后序:左右根


直接上代码
import operator

opMap = {'+':operator.add,'-':operator.sub,"/":operator.truediv,"*":operator.mul}
proMap = {'(':100,'+':3,'-':3,'*':8,'/':8,')':1,'#':0}

#获取下个操作数
def getNext(leftExpress):
    t = leftExpress[0:1]
    if t.isnumeric():
        for s in leftExpress[1:]:
            if not s.isnumeric():
                break
            else:
                t += s
        return t

    else:
        return t

def popStack():
    while opStack[-1] != '(':
        nStack.append(opStack.pop())
    opStack.pop()

def popStack2(s):
    pro1 = proMap[s]
    for i in range(len(opStack)):
        op = opStack[-1]
        if op == '(':
            opStack.append(s)
            break
        else:
            pro0 = proMap[op]
            if pro0 < pro1:
                opStack.append(s)
                break
            else:
                nStack.append(opStack.pop())

def calculate():
    num = len(nStack)
    i = 0
    while num > 1:
        c = nStack[i]
        if not c.isnumeric():
            x = nStack[i-1]
            y = nStack[i-2]
            res = opMap.get(c)(int(x),int(y))
            nStack[i] = str(res)
            nStack.remove(x)
            nStack.remove(y)
            i = 0
        else:
            i+=1
        num = len(nStack)
    return nStack.pop()


def dealwith(s):
    if s.isnumeric():
        nStack.append(s)
    elif s == '(':
        opStack.append(s)
    elif s == ')':
        popStack()
    elif opStack[-1] == '(':
        opStack.append(s)
    else:
        op = opStack[-1]
        pro0 = proMap[op]
        pro1 = proMap[s]
        if pro1 > pro0:
            opStack.append(s)
        else:
            popStack2(s)

def meger():            
    while len(opStack) > 1:
        nStack.append(opStack.pop())


express = '9+2*3'
opStack = ['#']
nStack = []
def run():
    i = 0
    l = len(express)
    while i < l:
        token = getNext(express[i:])
        dealwith(token)
        i+=len(token)
    meger()
    print(nStack)
    print(calculate())

if __name__ == '__main__':
    run()


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值