第六章 栈、队列和双端队列
栈
栈是一系列对象组成的集合,遵循后进先出(LIFO)的原则
栈的示例:
- 网页的后退操作
- 文本编辑器的撤销操作
栈的抽象数据类型
形式上,栈支持一下两种操作的抽象数据类型(ADT),S为ADT的实例:
S.push(e)
:将一个元素e添加到栈S的栈顶S.pop(e)
:从栈S中移除并返回栈顶的元素,如果栈为空,则报错
此外,为了方便,还定义了访问方法:
S.top()
:在不移除栈顶元素的前提下,返回一个栈S的栈顶元素,若栈为空,则报错S.is_empty()
:如果栈中不包含任何元素,则返回True
len(S)
:返回栈S中元素的数量;在python中,可用__len__
特殊方法实现
简单的基于数组的栈实现
如何使用一个列表实现栈元素的内部存储,并同时提供一个符合堆栈的公共接口
适配器模式
定义一个新类,包含一个现存类的实例作为隐藏域,然后用这个隐藏实例变量的方法实现新类的方法。
栈方法 | python的列表实现 |
---|---|
S.push(e) |
L.append(e) |
S.pop() |
L.pop() |
S.top() |
L[-1] |
S.is_empty() |
len(L)==0 |
len(S) |
len(L) |
用python的list实现一个栈
class Empty(Exception):
'''定义一个栈为空的报错'''
pass
class ArrayStack:
def __init__(self):
self._data = []
def __len__(self):
return len(self._data)
def is_empty(self):
return len(self._data)==0
def push(self,e):
self._data.append(e)
def top(self):
if self.is_empty():
raise Empty('Stack is empty')
return self._data[-1]
def pop(self):
if self.is_empty():
raise Empty('Stack is empty')
return self._data.pop()
if __name__ == '__main__':
S = ArrayStack()
S.push(5)
S.push(3)
print(len(S))
print(S.pop())
print(S.is_empty())
print(S.top())
print(S.pop())
print(S.is_empty())
print(len(S))
S.pop()
分析基于数组的栈的实现(*表示摊销)
操作 | 运行时间 |
---|---|
S.push(e) |
O ( 1 ) ∗ O(1)^* |