四、队列 & 栈
背景:在数组中,可以通过索引访问随机元素
,但是某些情况下可能要限制处理的顺序
大致了解:
- FIFO和LIFO处理顺序的原理
- 实现两个数据结构
- 熟悉内置的队列和栈结构
- 基本的队列问题
BFS
- 理解在使用
DFS
和其他递归算法解决问题时,系统栈是如何发挥作用的
(一)队列:先入先出FIFO
的数据结构
insert = enqueue 添加到队列末尾
delete = dequeue 只能移除第一个元素
1、实现 = 动态数组 + 指向队列头部的索引
缺点:存储空间的浪费
2、循环队列
优点:使用固定的数组SIZE和两个指针表示起始位置和结束位置
,重用上面实现方法的被浪费的存储空间
。
definition:循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。
用链表去做实现队列:
class MyCircularQueue:
def __init__(self, k: int):
self.head = self.tail = None
self.capacity = k
self.size = 0
def enQueue(self, value: int) -> bool:
if self.isFull():
return False
node = ListNode(value)
if self.head is None:
self.head = node
self.tail = node
else:
self.tail.next = node
self.tail = node
self.size += 1
return True
def deQueue(self) -> bool:
if self.isEmpty():
return False
self.head = self.head.next
self.size -= 1
return True
def Front(self) -> int:
return -1 if self.isEmpty() else self.head.val
def Rear(self) -> int:
return -1 if self.isEmpty() else self.tail.val
def isEmpty(self) -> bool:
return self.size == 0
def isFull(self) -> bool:
return self.size == self.capacity
3、用法
大多数流行语言都提供内置的队列库,因此无需重新发明轮子。
Python内置队列库函数 collection.deque
(二)队列和广度优先搜索BFS
1、队列和BFS
BFS一个常见应用是找出从根结点到目标结点的最短路径
结点的处理顺序与它们添加
到队列的顺序是完全相同的顺序
,即先进先出FIFO。这就是我们在 BFS 中使用队列的原因
2、广度优先搜索 - 模板
(三)栈:后入先出LIFO
的数据结构
- 理解LIFO和栈的定义
- 用动态数组
实现
栈 - 熟悉
内置栈结构
- 能够使用栈解决问题
1、后入先出的数据结构
push 入栈,末尾添加新元素
pop 退栈,始终删除队列中相对于它的最后一个元素
栈的实现比队列简单,仅需用到动态数组即可