python数据结构——双端队列
目录:
一、队列
1、什么是队列?
队列是一种先进先出的数据结构(数据结构:用于存储一系列数据的集合我们就称之为数据结构,python原生的数据结构有:list、tuple、dict、set)它类似于列表和堆栈,而栈是一种后进后出的数据结构。队列是一群人或者事物按照一定的顺序等待接受服务或者处理。队列只允许在后端进行插入操作,在前端进行删除操作,这两种操作又叫 - 入队和出队操作。
2、工作原理(什么是先进先出?)
比如:现实生活中我们去超市买东西,我们买好东西结账的时候就需要排队,那么这个排队就是入队,当结完账走了就是出队,这个整个过程或者说行为就是我们就称之为——队列的工作原理。
二、双向队列
1、队列介绍
python标准库中有多种队列,比如 :queue.Queue 、asyncio.Queue 、 multiprocessing.Queue 、collections.deque
而我们今天学习的就是 collections 模块下的 deque 类,我们称这个类为 “双向队列” 或者 “双端队列”。
2、双端队列
“双端队列” 是一种具有队列和栈的性质的数据结构。双端队列的元素可以从两端弹出,限定插入和删除操作可以在队列的两端进行,我们可以理解为 “双端队列” 可以从队列的两端对元素进行添加和删除……等的操作,并且我们可以在创建或者说实例化 “双端队列” 的时候指定队列的长度或者说大小。当这个队列满了,我们可以反向端删除过期元素(从前删除),然后将新元素添加到队列的末尾。
3、原理图
4、常用操作
(1)导入 deque 类
from collections import deque
(2)创建双端队列对象
listdq = deque(iterable, maxlen)
# 参数说明
iterable : 可迭代对象
maxlen :int类型的缺省参数, 最大长度或者大小
# 示例
listdq = deque(range(10), maxlen=10)
# 创建一个空的双端队列
listdq = deque()
(3)双端队列的旋转
双端队列的旋转操作将接收一个参数n,当 n>0时,队列最右边的n个元素会被移动到队列的右边,原本位置的元素将后移;当n<0时,最左边的n个元素会被移动到右边,原始元素后边的元素将前移。
- 正向旋转
# 将队列右边的两个元素移动到队列的左边
listdq.rotate(2)
- 反向旋转
# 将队列左边的两个元素移动到队列的右边
listdq.rotate(-2)
(4)添加元素
**① append:**在队列末尾(最右边)添加元素。
说明:
当队列的成员元素到达上限,那么将自动删除最左边的一个元素,其后元素前移,并将需要添加的元素添加到队列的末尾;如果队列中还有空位置,那么将直接添加到最后一个元素的后边。
# 向双端队列的末尾添加元素
listdq.append(40)
listdq.append(22)
**② appendleft :**在队列的开始(最左边)添加元素。
说明:
当队列的成员元素到达上限,那么将自动删除最右边的一个元素,其前边的元素后移,并将需要添加的元素添加到队列的开始(最左边);如果队列中还有空位置,那么将直接添加到第一个元素的前边,原来的首元素后移。
# 向双端队列的末尾添加元素
listdq.appendleft(40)
listdq.appendleft(22)
**③ extend :**以批量添加的方式,向队列的最后即右边添加元素
说明:
如果批量添加的元素<len(双端队列),那么将在队列的左边删除同样个数的元素,并将需要添加的元素批量添加到队列的最后;如果批量添加的元素>len(双端队列),那么将拿到需要添加元素后边的相同个数的元素,将原始队列中的元素全部替换;如果批量添加的元素=len(双端队列),则直接替换原始队列中的元素。
# 向队列的最右边添加可迭代对象,即批量添加元素
dqlist.extend(range(20))
**④ extendleft :**以批量添加元素的方式,向队列的最前边,即最右边添加元素
说明:
如果批量添加的元素<len(双端队列),那么将在队列的右边删除同样个数的元素,并将需要添加的元素批量添加到队列的最前边,即最左边;如果批量添加的元素>len(双端队列),那么将拿到需要添加元素后边的相同个数的元素,将原始队列中的元素全部替换;如果批量添加的元素=len(双端队列),则直接替换原始队列中的元素。
# 向对立欸但最左边添加可迭代对象,即批量添加元素
dqlist.extendleft(range(15,20))
(5)删除元素
① pop 方法
说明:
pop 方法用于对双端队列中的最后一个元素,即最右边的元素进行删除操作,并且该函数不能有参数。
# 删除双端队列中最后一个元素,即最右边的元素
dqlist.pop()
② popleft 方法
说明:
popleft 方法用于对双端队列中的第一个元素,即最左边的元素进行删除操作,并且该函数不能有参数。
# 删除双端队列中第一个元素,即最左边的元素
dqlist.poplist()
③ remove 方法
说明 :
对队列中已有的元素值进行删除操作,其参数为 object ,即一个已有的对象
# 删除双端队列中某个值的元素,也就是说拿元素值删除元素
dqlist.remove(9)
(6)清空队列
# 清空双端队列,使其成为一个空的队列
dqlist.clear()
(7)获取队列中某个元素出现的个数
# 获取双端队列中9这个元素出现的个数
dqlist.count(9)
(8)通过索引下标取值
# 双端队列具有list的性质,那么就可以使用索引下标的方式来取值
dqlist[0]
dqlist[5]
(7)获取队列中某个元素出现的个数
# 获取双端队列中9这个元素出现的个数
dqlist.count(9)
(8)通过索引下标取值
# 双端队列具有list的性质,那么就可以使用索引下标的方式来取值
dqlist[0]
dqlist[5]