队列定义
队列时有序集合,添加操作发生在“尾部”,移除操作发生在“头部”。这种排序原则称为FIFO(first-in first-out),即先进先出。(在日常生活中,我们去超市买东西排队,这便是最简单的队列的例子。)
队列-queue-python
from queue import *
q = Queue() # 定义一个队列
q.empty() # 判断队列是否为空
n = 5
for i in range(n):
q.put(i) # 从队尾插入元素,将元素0, 1, 2, 3, 4放到队列q中
print(q.qsize()) # q.qsize()返回队列大小
# 5
print(q.empty())
# False
for i in range(n):
m = q.get() # 从队头删除元素并返回
print(m, end = ' ') # 将元素从队列中取出, 遵循队列先进先出的原则
# 0, 1, 2, 3, 4
print(q.qsize())
# 0
print(q.empty())
# True
双端队列-deque-python
双端队列是与队列类似的有序集合。它有一前、一后两端,元素在其中保持自己的位置。双端队列在哪一端添加和移除元素没有任何限制。新元素既可以被添加到前端,也可以被添加到后端。同样地,已有的元素也可以从任意一端移除。某种意义上,双端队列是栈和队列的结合。
双端队列-collections-deque
from collections import deque
d = deque('abc') # 创建一个有三个元素的双端队列
d # 查看队列d中的元素
# deque(['a', 'b', 'c'])
for val in d: # 遍历队列d中的元素
print(val.upper())
# A
# B
# C
d.append('d') # 在队列d的右边添加一个新的元素
d.appendleft('e') # 在队列d的左边添加一个新的元素
d # 查看队列d中的元素
# deque(['e', 'a', 'b', 'c', 'd'])
d.pop() # 返回并移除队列d中最右边的元素
# 'd'
d.popleft() # 返回并移除队列d中最左边的元素
# 'e'
list(d) # 以列表形式返回队列d中的元素
# ['a', 'b', 'c']
d[0] # 返回队列d中最左边的元素
# 'a'
d[-1] # 返回队列d中最右边的元素
# 'c'
list(reversed(d)) # 翻转队列中的元素并以列表形式返回
# ['c', 'b', 'a']
d.extend('fjhi') # 在队列d的最右边添加多个元素
d.extendleft('xyz') # 在队列d的最右边添加多个元素
d # 查看队列d中的元素
# deque(['z', 'y', 'x', 'a', 'b', 'c', 'f', 'j', 'h', 'i'])
d.rotate(1) # 将队列中的元素整体向后移一位,原最后一个元素放到队首
d # 查看队列d中的元素
# deque(['i', 'z', 'y', 'x', 'a', 'b', 'c', 'f', 'j', 'h'])
d.rotate(-1)# 将队列中的元素整体向前移一位,队首的元素放到队尾
d # 查看队列d中的元素
# deque(['z', 'y', 'x', 'a', 'b', 'c', 'f', 'j', 'h', 'i'])
deque(reversed(d)) # 翻转队列d,返回一个新的队列
# deque(['i', 'h', 'j', 'f', 'c', 'b', 'a', 'x', 'y', 'z'])
d.clear() # 清空队列
d.extendleft('abc') # extendleft()翻转输入的元素
d # 查看队列d中的元素
# deque(['c', 'b', 'a'])