本文主要介绍一种重要的数据结构——栈,及其Python语言下的实现方式。
在了解了线性表这种数据结构之后,我们会思考线性表的具体应用,栈就是其中一种重要的形式。
栈的基本介绍
栈和队列都是保存数据元素的容器,都是简单的缓存结构,都只支持数据项的存储和访问操作,不支持数据项之间的任何关系。因此,两种数据结构的操作集合都很小,很简单,其中最重要的就是存入元素和取出元素。当然,作为数据结构还应包含几个任何数据结构都应包含的操作,如结构的构建,查空状态等。当然,栈和队列的最大区别在于存取时间顺序关系更方面的特点:
- 栈是保证元素后进先出(后存入者先使用,Last In First Out)关系的结构,简称为LIFO结构。
- 队列是保证元素先进先出(先存入者先使用,First In First Out)关系的结构,简称为FIFO结构。
对于一个栈或者队列,在任何时候,下一次访问或者删除的元素都默认地唯一确定了,只有新存入或者删除(弹出)操作才会改变下一次默认访问的元素。
生活中有很多栈的应用实例,比如我们使用浏览器有一个后退功能,即回到上一个网页,这就是应用的栈的原理;再如我们操作word有撤销功能,这也是一种栈的应用。栈的应用是非常广泛的,这里不重点介绍。
栈的Python语言实现。
前面我们有说过栈是线性表的一种具体应用,对于线性表来说又有两种实现模型:顺序表和链表。下面将基于这两种结构讨论栈的实现。
栈的顺序表实现
# 栈的顺序表实现
class SStack():
#初始化并创建空栈
def __init__(self):
self._elems = []
#检测是否为空
def is_empty(self):
return self._elems == []
#输出栈顶数据
def top(self):
if self._elems == []:
raise StackUnderflow('in stack.top()')
return self._elems[-1]
#压入元素
def push(self, elem):
self._elems.append(elem)
#弹出元素
def pop(self):
if self._elems == []:
raise StackUnderflow('in stack.pop()')
self._elems.pop()
栈的链表实现
# 栈的链表实现
class LStack():
def __init__(self):
self._top = None
def is_empty(self):
return self._top == None
def top(self):
if self._elems == []:
raise StackUnderflow('in stack.top()')
return self._top.elem
def push(self, elem):
self._top.next = LNode(elem, self._top)
def pop(self):
if self._elems == []:
raise StackUnderflow('in stack.pop()')
p = self._top
self.top = p.next
return p.elem