文章目录
栈
一系列对象组成的一个集合。这些对象的插入和删除操作遵循先进后出的原则。
栈顶:最后一个插入的对象的位置。
栈的抽象数据类型
操作 | 作用 |
---|---|
S.push(e) | 将元素e添加到S的栈顶 |
S.pop() | 从栈S中移除并返回栈顶的元素 |
S.top() | 返回栈顶的元素 |
S.is_empty | 判断是否为空 |
len(S) | 返回栈S中的元素数量 |
简单的基于数组的栈实现
适配器模式
用特殊的方式定义一个新的类,这种方式以包含一个现存类的实例作为隐藏域,然后用这个隐藏实例变量的方法实现这个新类的方法。
用Python的list类实现一个栈
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 pop(self):
if self.is_empty():
raise Empty("")
return self._data.pop()
def top():
if self.is_empty():
raise Empty("")
return self._data[-1]
分析基于数组的栈的实现
操作 | 时间复杂度 |
---|---|
S.push(e) | O(1)* |
S.pop() | O(1)* |
S.top() | O(1) |
S.is_empty | O(1) |
len(S) | O(1) |
队列
一系列对象的集合。这些对象的插入和阐述遵循先进先出原则。
队头:允许删除的一端。
队列的抽象数据类型
操作 | 作用 |
---|---|
Q.enqueue(e) | 向队列Q的队尾添加一个元素 |
Q.dequeue() | 向队列Q中移除并返回第一个元素 |
Q.first() | 返回队头的元素 |
Q.is_empty | 判断是否为空 |
len(Q) | 返回栈S中的元素数量 |
基于数组的队列实现
dequeue操作倘若用pop(0)的话,总是处于最坏的情况,耗时为 Θ ( n ) \Theta(n) Θ(n)
循环使用数组
一种思路是:进行dequeue操作时,使队头变为None,指向队头的标识符往后移动一个单元。但是这样的话,会造成数组的内存使用比较浪费,因为标识符会无限往后退,即使元素数量没超过数组大小。
于是我们采用循环数组。
标识符更新公式
f =