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