堆栈是一种非常常见且简单易用的数据结构,适用在多种应用场合。堆栈是一种数据项按序排列的数据结构,只能在一端(栈顶)对数据项进行插入和删除,遵循后进先出的原则。
在不同的需求中,栈的操作可能不仅限于进栈和出栈,可能还需要检测栈是否为空,获取栈顶元素但并不将其弹出,遍历栈内所有元素,或者检测某元素是否在栈中存在等等。
在Python中,一个简单的列表元素通常足够用来实现栈:它允许对其中的元素进行任意操作,从任意一端插入或取出元素。下表总结了一些Python内置的列表操作方法来模拟栈操作。
操作 | 栈顶处于列表末尾 | 栈顶位于列表起始位置 | 栈顶位于列表起始位置 |
新建 | stack=['a', 'b'] | stack=['b', 'a'] | stack=['b', 'a'] |
进栈 | stack.append('c') | stack.insert(0,'c') | stack[0:0]=['c'] |
出栈 | top = stack[-1] del stack[-1] | top = stack[0] del stack[0] | top = stack[0] stack[:1] = [] |
在上表中,我们的出栈操作分为两步,先获取元素,后删除。实际上,要完成这一工作,有个更简单的方法就是利用Python的pop方法,它默认删除列表末尾的元素并返回。该方法支持传入一个参数,即偏移量。即删除并返回指定位置的元素。
甚至说还有一种方法可以实现:
# top is front of list top, stack = stack[0], stack[1:] # Python 1.X+ top, *stack = stack # Python 3.X # top is end of list stack, top = stack[:-1], stack[-1] # Python 1.X+ *stack, top = stack # Python 3.X
不过该方法的确点在于会额外生成新的列表。
本文部分翻译自《Programming Python》4th Edition