1. 简介
队列(Queue)是一种特殊的线性表,它只允许在表的一端进行插入操作,在另一端进行删除操作。允许插入的一端称为队尾,允许删除的一端称为队头。python的 queue 模块,提供了多种队列类,能够更高效、安全地处理队列相关的操作,尤其在多线程环境下。
queue模块是Python内置的标准模块,模块实现了五种主要类型的队列:deque双端队列、Queue先进先出(FIFO)队列、LifoQueue后进先出LIFO队列、PriorityQueue优先级队列,以及SimpleQueue 先入先出类型的简单队列
2.常见列表操作
(1)创建队列
直接初始化一个空列表即可,例如 my_queue = []。
(2)入队(enqueue)
使用列表的 append() 方法将元素添加到列表末尾,相当于队尾插入元素。例如,my_queue.append(item)。
(3)出队(dequeue)
使用列表的 pop(0) 方法移除并返回列表的第一个元素,相当于队头删除元素。例如,item = my_queue.pop(0)。注意,这种方法在队列较大时效率较低,因为每次从队头删除元素后,列表中所有后续元素都需要向前移动一个位置。
(4)判断队列是否为空
检查列表长度是否为 0,即 if not my_queue:。
(5)获取队列大小
使用 len() 函数获取列表长度,例如 size = len(my_queue)。
2. deque双端队列
双端队列又叫双边队列。deque中的方法基本都有两侧版本,这就体现了双端队列的特征。deque 的左边(left)就相当于它是队列头(front),右边(right)就相当于它是队列尾(rear),默认右侧队尾。
(1)创建双端队列
可以通过 collections.deque() 来创建一个空的双端队列。
也可以传入一个可迭代对象来初始化双端队列,例如列表、字符串等,元素会按照可迭代对象的顺序添加到双端队列的右侧。
from collections import deque
deque_empty = deque()
print("创建空双端队列:", deque_empty)
deque_from_list = deque([1, 2, 3])
print("用列表初始化双端队列:", deque_from_list)
deque_from_str = deque("abc")
print("用字符串初始化双端队列:", deque_from_str)
程序运行结果:
(2)添加元素
- append(item)
将元素 item 添加到双端队列的右侧。
from collections import deque
dq = deque([1, 2, 3])
print("创建双端队列:", dq)
dq.append(4)
print("右侧添加元素后的双端队列:", dq)
程序运行结构:
- appendleft(item)
将元素 item 添加到双端队列的左侧。
样例:
from collections import deque
dq = deque([1, 2, 3])
print("创建双端队列:", dq)
dq.appendleft(0)
print("左侧添加元素后的双端队列:", dq)
程序运行结果:
(3)移除元素
- pop()
移除队列右侧元素并返回移除元素后的队列。如果队列为空,会抛出 IndexError 异常。
样例:
from collections import deque
dq = deque([1, 2, 3, 4])
print("创建双端队列:", dq)
# 从右侧移除元素
item = dq.pop()
print("移除的元素:", item)
print("移除元素后的双端队列:", dq)
程序运行结果:
- popleft()
从左侧移除元素并返回移除元素后的队列。如果队列为空,会抛出 IndexError 异常。
样例:
from collections import deque
dq = deque([1, 2, 3, 4])
print("初始双端队列:", dq)
# 从左侧移除元素
item = dq.popleft()
print("移除的元素:", item)
print("移除元素后的双端队列:", dq)
运行结果:
- remove(value)
移除双端队列中***第一个***出现的值为 value 的元素。如果元素不存在,会抛出 ValueError 异常。
举例:
from collections import deque
dq = deque([1, 2, 3, 4, 2, 5, 8, 9])
print("创建双端队列:", dq)
dq.remove(2)
print("删除元素后的双端队列:", dq)
程序运行结果:
(4)查找元素
- index(x[, start[, end]])
返回元素 x 在双端队列中的位置(下标)。可以指定搜索的起始位置(start)和结束位置(end)。如果元素不在范围内,会抛出 ValueError 异常。
样例:
from collections import deque
dq = deque([1, 2, 3, 4, 2, 5, 8, 9])
print("创建双端队列:", dq)
index_2 = dq.index(2)
print("元素 2 的位置:", index_2)
index_2_range = dq.index(2, 2, 5)
print("元素 2 在指定范围内的位置:", index_2_range)
程序运行结果:
我们在看一个查找的元素不在队列中的情况。
from collections import deque
dq = deque([1, 2, 3, 4, 2, 5, 8, 9])
print("创建双端队列:", dq)
index_2 = dq.index(22)
print("元素 2 的位置:", index_2)
程序运行结果:
确实报了ValueError的异常信息。
- count(x)
返回元素 x 在双端队列中出现的次数。
样例:
from collections import deque
dq = deque([1, 2, 3, 2, 4, 2, 8, 9,2])
print("创建双端队列:", dq)
count_2 = dq.count(2)
print("元素 2 出现的次数:", count_2)
程序运行结果:
(4)扩展双端队列
- extend(iterable)
将可迭代对象(iterable)中的元素添加到双端队列的右侧。
from collections import deque
dq = deque([1, 2, 3])
print("创建双端队列:", dq)
dq.extend([4, 5, 6])
print("右侧扩展后的双端队列:", dq)
程序运行结果:
- extendleft(iterable)
将可迭代对象(iterable)中的元素添加到双端队列的左侧。注意,元素的添加顺序是可迭代对象的逆序。
from collections import deque
dq = deque([1, 2, 3])
print("初始双端队列:", dq)
dq.extendleft([0, -1, -2])
print("左侧扩展后的双端队列:", dq)
程序运行结果:注意观察加入的顺序。
(5)旋转队列
- rotate(n=1)
将双端队列中的元素向右移动 n 步。如果 n 为负数,则向左移动。例如,当 n =1 时,最后一个元素移到队列头部,其他元素向右移动一位;当 n = -1 时,第一个元素移到队列尾部,其他元素向左移动一位。
样例:
from collections import deque
dq = deque([1, 2, 3, 4, 5])
print("初始双端队列:", dq)
dq.rotate(1)
print("向右旋转 1 步后的双端队列:", dq)
dq.rotate(-2)
print("向左旋转 2 步后的双端队列:", dq)
程序运行结果:
(6)清空双端队列
- clear()
清空双端队列中的所有元素。
from collections import deque
dq = deque([1, 2, 3, 4, 5])
print("创建双端队列:", dq)
# 清空双端队列
dq.clear()
print("清空后的双端队列:", dq)
程序运行结果: