堆栈(Stack)是一种用来存储数据的特殊结构。下面这个例子可以形象地说明这个概念。假设有一落硬币,我们不能从中间取出硬币,只能拿最上面的那一枚。同样,如果要加入新的硬币,也只能放到最上面。
由于这样的关系,堆栈还有一个更加形象的名字,叫做“后进先出”(Last In First Out, LIFO)。也就是说,最后放上去的硬币,最先被拿走。所以说,堆栈这样的对象有两种操作:进栈(Push)和出栈(Pop)。其实,很多经典程序设计都用到了堆栈的概念。可以说,如果没有堆栈,很多算法都难以实现。
下面我们通过简单的例子来介绍如何在Python中实现堆栈。这里我们会介绍两种方法:过程化程序设计和面向对象程序设计。
1. 过程化程序设计
首先,我们要考虑如何存储进入堆栈的数值。在这里,我们用Python中的列表(List)来完成这个工作。列表比较简单,可以帮助说明问题。同时,假设堆栈的大小不确定,而且最后一个数值位于堆栈顶部。用下面的Python程序就可以创建堆栈。
然后,定义一个函数,用来向堆栈中存储数据。这里我们要做几个假设:
函数名叫push
函数有一个参数,参数值将存入堆栈
函数返回值为空
函数将其他值依次放在堆栈的最后。
我们定义的函数如下:
def push(value):
my_stack.append(value)
既然定义了进栈的函数,与之对应的就要定义出栈的函数。我们假设:
函数名叫pop
函数无参数
函数返回从堆栈中取出的值
函数从堆栈顶部取出数值
def pop():
value = my_stack[-1]
del my_stack[-1]
return value
有一点需要说明:这个函数没有检查堆栈是否为空。
我们把上面的程序连起来,看一下数值在堆栈中的运动过程。
my_stack = []
def push(value):
my_stack.append(value)
def pop():
value = my_stack[-1]
del my_stack[-1]
return value
push(3)
push(2)
push(1)
print(pop())
print(pop())
print(pop())
输出
在上面的程序中,先把三个数(3, 2, 1)存入堆栈,然后在把它们提出来。打印出来的顺序是1, 2, 3。这显示了堆栈后进先出的规则。