python数据结构——双端队列

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]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

御弟謌謌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值