目录
一、定义
1. 环形队列
2. 自定义队列
二、队列的内置模块
1. 双向队列
一、定义
- 队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
- 进行插入的一端称为队尾(rear),插入动作称为进队或入队。
- 进行删除的一端称为队头(front),删除动作称为出队。
- 队列的性质:先进先出(First-in, First-out)。
队列也可以使用列表来实现:
但是这种情况下会出现一个问题:若我们采用pop(下标来进行出队),此时操作上时间复杂度为为O(n),而且在情况(d)下,此时如果我们还需要入栈,只能在后面的空间上,前面的空间会造成浪费,因此我们引入环形队列。 可以到最后从头到尾接起来。
1. 环形队列
定义:当队尾指针front == Maxsize - 1时, 再前进一个位置就自动到0.
- 队首指针前进1:front = (front + 1)% MaxSize
- 队尾指针前进1:rear = (rear + 1)% MaxSize
- 队空条件:rear == front
- 队满条件:(rear + 1) % MaxSize == front
对满的情况少1格是为了防止与空队列的情况相同。
2. 自定义队列
我们可以通过自己创建一个类来实现队列的功能,示例代码如下:
class Queue:
def __init__(self, size = 100): # 创建一个大小为100的列表
self.queue = [0 for _ in range(size)]
self.size = size
self.rear = 0 # 队尾 = 0
self.front = 0 #队首 = 0
def push(self,element): # 进队
if not self.is_filled(): #判断队满
self.rear = (self.rear +1) % self.size
self.queue[self.rear] = element
else:
raise IndexError("Queue is filled")
def pop(self): #出队
if not self.is_empty(): # 判断队空
self.front = (self.front +1) % self.size
return self.queue[self.front] # 返回最后一位的元素
else:
raise IndexError("Queue is empty")
def is_empty(self): #判断队空
return self.rear == self.front
def is_filled(self): # 判断队满
return (self.rear + 1) % self.size == self.front
二、队列的内置模块
1. 双向队列
双向队列的两端都支持进队和出队的操作。
双向队列的基本操作:
- 队首进队
- 对手出队
- 队尾进队
- 队尾出队
这个队列与多线程中的队列不一样。是一种特殊的数据结构。
- 使用方法:
from collections import deque
- 创建队列: queue = deque()
- 进队:append()
- 出队:popleft()
- 双向队列队首进队:appendlleft()
- 双向队列队尾出队:pop()
实例:
如果我们需要打印一个文件的后几行,可以使用队列
from collections import deque
# q = deque([1, 2, 3, 4, 5],5)
def tail(n): # n表示打印几行
with open('test.txt', 'r') as f:
q = deque(f, n) # f表示读取的内容,n表示最大队列的范围 # 每次读取一个f
return q
# deque的特性:当队满时,此时再进队会自动使得第一位的元素出队
for line in tail(5):
print(line, end='')
实现思路:我们设置n = 5,那么当我们把整个数据传入列表中时。队列满出来,使得前面的数据自动出队,最后只剩下最后的5行元素。