简单介绍python的双向队列

简单介绍python的双向队列

介绍

  大家都知道利用 .append 和 .pop 方法,我们可以把列表当作栈或者队列来用(比如,把 append 和 pop(0) 合起来用,就能模拟栈的“先进先出”的特点)。但是删除列表的第一个元素(抑或是在第一个元素之前添加一个 元素)之类的操作是很耗时的,因为这些操作会牵扯到移动列表里的所有元素。这个时候双向队列就又作用了。

deque 是什么

  collections.deque 类(双向队列)是一个线程安全、可以快速从两端添加或者删除元素的数据类型。而且如果想要有一种数据类型来存 放“最近用到的几个元素”,deque 也是一个很好的选择。这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后在尾端添加新的元素。

下面用几个实例来说明如何使用双向队列以及带来了什么方便的处理方式。

一开始我们需要先初始化一个固定长度的双向队列便于我们实验。

说明:maxlen 是一个可选参数,代表这个队列可以容纳的元素的数量,不可变。

from collections import  deque
#双向队列
listdq=deque(range(10),maxlen=10)
print (listdq)

1.正向旋转(循环)

 说明:队列的旋转操作接受一个参数 n,当 n > 0 时,队列的最右边的 n 个元素会被移动到队列的左边。当 n < 0 时,最左边的 n 个元素会被 移动到右边。

#正向旋转
listdq.rotate(2)
print(listdq)

2.反向旋转(逆时针)

#反向旋转
listdq.rotate(-2)
print(listdq)

3.附加数据

说明:当试图对一个已满(len(d) == d.maxlen)的队列做尾部添加操作的时候,它头部的元素会被删除掉。注意在下一行里,元素 0 被删除 了。


#附加数据
listdq.appendleft(-1)
print(listdq)
listdq.append(10)
print(listdq)
 

4.扩展数据

说明:extendleft(iter) 方法会把迭代器里的元素逐个添加到双向队列的左边,因此迭代器里的元素会逆序出现在队列里。注意是逆序。

#扩展数据
listdq.extendleft([20,30,40])
print(listdq)
listdq.extend([50])
print(listdq)

以上代码结果如下:

<span>简单介绍python的双向队列</span>

双向列表和队列的方法介绍:

<span>简单介绍python的双向队列</span>

 

总结:

本篇总结了列表和双向队列这两个类型的方法(object 类包含的方 法除外)。
双向队列实现了大部分列表所拥有的方法,也有一些额外的符合自身设 计的方法,比如说 popleft 和 rotate。但是为了实现这些方法,双向 队列也付出了一些代价,从队列中间删除元素的操作会慢一些,因为它 只对在头尾的操作进行了优化。
append 和 popleft 都是原子操作,也就说是 deque 可以在多线程程序 中安全地当作先进先出的栈使用,而使用者不需要担心资源锁的问题。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119657.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android TV androidx.leanback:leanback 开箱体验

    Android TV androidx.leanback:leanback 开箱体验publicclassHomeFragmentextendsBrowseSupportFragment{privatestaticfinalintGRID_ITEM_WIDTH=200;privatestaticfinalintGRID_ITEM_HEIGHT=200;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCr…

    2022年7月15日
    14
  • MongoDB(二)—-数据库操作

    MongoDB(二)—-数据库操作

    2020年11月12日
    196
  • mybatis和hibernate的以及jpa区别_hibernate sql

    mybatis和hibernate的以及jpa区别_hibernate sql1简单简介  1.1  Hibernate框架     Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,建立对象与数据库表的映射。是一个全自动的、完全面向对象的持久层框架。  1.2  Mybatis框架    Mybatis是一个开源对象关系映射框架,原名:ibatis,2010年由

    2025年10月19日
    6
  • 算法复杂度比较「建议收藏」

    算法复杂度比较「建议收藏」常见函数算法时间复杂度由小到大依次为:Ο(1)<Ο(loga^n)<Ο(n)<Ο(nlogn)<Ο(n2)<Ο(n3)<Ο(n!)<Ο(N^n)常见算法复杂度对比快速排序nlogn堆排序nlogn冒泡排序在改良的冒泡下最优时间复杂度为n插入排序最优下n选择排序n*n归并nlogn对N个数进行排序,在各自最优条件下以下算法复杂度最…

    2025年7月22日
    3
  • js生成二维码原理_二维码生成器原理

    js生成二维码原理_二维码生成器原理1.引用相关的js文件:        jquery.qrcode.js,qrcode.js    2.js代码如下:           3.html页面主要部分:       以上就可以生成自己的二维码了,手机扫描就可以跳转到指定的页面或者显示内容。   相关的代码在这:http://download.csdn.net/detail/go_walkin

    2022年10月17日
    2
  • 添加员工功能400报错

    添加员工功能400报错真的心酸,找了两个多小时的bug,各方面数据数据都比对过了,还把源码复制过来直接用,就是找不到问题一直报错400,最后发现是配置文件的问题,在添加员工日期时没有采用一致格式,需要进行配置。…

    2022年5月13日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号