高阶python | 堆栈列表:RPN应用(模拟逆波兰式功能实现)

python版本:3.10

在列表中,append和pop方法有一个特殊的用途。可以在列表上使用这两个方法让列表变成一个堆栈使用。

这就是一个栈,它是先进后出,类似单门轿厢电梯一样的设计,出入口共用

堆栈最有用的应用之一就是做逆波兰式表达法(RPN)的解释器。RPN使用后缀表达式,至于人类怎么将自己常用的数学式转换为RPN表达式,可以搜本账号先前发布的文章《odoo14 | odoo中domain的复杂写法》中前半部分的基础教学来学习转换过程。

使用RPN的好处就是,可以用明确的方式将这两个操作数和运算符放在一起而不需要使用括号,例如:

10 5 * 7 3 + /

这个表达式等价于下面的常用表达式(中缀表达式),结果为 5.0:

(10 * 5) / (7+3)

下面是一个实现RPN逻辑的python代码

the_stack = []


def push(v):
    the_stack.append(v)


def pop():
    return the_stack.pop()


def main():
    s = input('enter rpn string:')
    a_list = s.split()
    for item in a_list:
        if item in '+-*/':
            op2 = pop()
            op1 = pop()
            if item == '+':
                push(op1 + op2)
            elif item == '-':
                push(op1 - op2)
            elif item == '*':
                push(op1 * op2)
            else:
                push(op1 / op2)
        else:
            push(float(item))
    print(pop())


main()

# 输入:2 3 +
# 要有空格

>>> enter rpn string: 2 3 * 4 5 + *
54.0

只要识别到运算符就将堆栈中的倒一和倒二取出并进行运算后再将结果放回,直到运行到最后一个运算符,将堆栈中的最后两个结果运算后将最终结果放回,执行到最后再将堆栈中的唯一存在的结果取出输出到终端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值