# 队列两端都可以进行push和pop操作。 push操作可以用循环双端链表的append,appendleft。
# pop操作使用循环双端链表的romoveclass Node(object): # 结点有两个指针def __init__(self, maxsize = None, value = None, next = None, prev = None):self.maxsize = maxsizeself.value = valueself.next = nextself.prev = prevclass Dqueue(object):def __init__(self, maxsize = None):self.maxsize = maxsizenode = Node()node.next = nodenode.prev = node # 最开始的只有根结点,它自己两个指针指向自己self.root = nodeself.length = 0def __len__(self):return self.lengthdef headnode(self):return self.root.nextdef tailnode(self):return self.root.prevdef push(self, value):    # 在右端压入值,相当于循环双端链表的appendif self.maxsize is not None and len(self) >= self.maxsize:raise Exception('full')node = Node(value = value)tailnode = self.tailnode() # 获取尾结点, 这个这次append 是插入的第一个结点。 尾结点就是self.root (根结点)tailnode.next = nodenode.prev = tailnodenode.next = self.rootself.root.prev = nodeself.length += 1def pushleft(self, value):if self.maxsize is not None and len(self) >= self.maxsize:raise Exception('full')node = Node(value = value)if self.root.next == self.root:  # 最初只有一个根结点的情况self.root.next = nodeself.root.prev = nodenode.next = self.rootnode.prev = self.rootelse:head = self.root.nextnode.next = headnode.prev = self.rootself.root.next = nodehead.prev = nodeself.length += 1def remove(self, node):       # 注意这里传入的是一个node, 不是传入一个值。 为了,降低算法复杂度if node is self.root:return "不能移除根结点"node.prev.next = node.nextnode.next.prev = node.prevself.length -= 1del nodedef iter_node(self):     #  遍历结点if self.root.next == self.root: # 只有根结点return "队列为空"curnode = self.root.nextwhile curnode.next is not self.root:yield curnodecurnode = curnode.nextyield curnode    # 尾结点也要遍历def __iter__(self):for node in self.iter_node():yield node.valuedef iter_node_reverse(self): # 反向遍历if self.root.prev is self.root:returncurnode = self.root.prev    # tailnodewhile curnode.prev is not self.root:yield curnodecurnode =  curnode.prevyield curnodedef pop(self):tailnode = self.tailnode()self.remove(tailnode)def popleft(self):head = self.headnode()self.remove(head)def test_Dqueue():  # 测试函数 就测试了主要的pop和pushdq = Dqueue()dq.push(1)dq.push(2)assert len(dq) == 2assert list(dq) == [1,2]dq.pushleft(3)assert list(dq) == [3,1,2]dq.pop()assert list(dq) == [3,1]dq.popleft()assert list(dq) == [1]

转载于:https://www.cnblogs.com/dairuiquan/p/10381409.html

python 实现双端队列相关推荐

  1. Python实现双端队列

    Python实现双端队列 关于双端队列的介绍,请参考:https://blog.csdn.net/weixin_43790276/article/details/104033337 双端队列的数据存储 ...

  2. python deque双端队列的神奇用法

    python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...

  3. [转载] Python的双端队列deque

    参考链接: Python中的双端队列DeQue Python的强大并不在于它的语法,而在于它的库,当你对各种数据结构感到苦恼时,Python提供了各种开箱即用的数据结构. 数据结构中最常讲授的数据结构 ...

  4. 用Python实现双端队列

    双端队列 双端队列(deque,全名double-ended queue),是⼀种具有队列和栈的 性质的数据结构. 双端队列中的元素可以从两端弹出,其限定插⼊和删除操作在表的两端进 ⾏.双端队列可以在 ...

  5. 用Python的双端队列deque实现非常简单的大富翁地图

    一.双端队列简介 双端队列有一个方法是rotate.可以把数据想成一个圆环,rotate能让它转起来,转多少,取决于我们给的参数.参数为正整数,那就顺时针旋转,为负整数则逆时针旋转. from col ...

  6. Python利用双端队列判断回文词

    #默认右端为队首 class Deque:def __init__(self):self.items = []def isEmpty(self):return self.items == []def ...

  7. 数据结构与算法(Python版) | (6) 线性结构---队列、双端队列和列表

    本专栏主要基于北大的数据结构与算法教程(Python版)进行整理,包括课程笔记和OJ作业. 课程链接 1. 队列抽象数据类型及Python实现 什么是队列? 队列是一种有次序的数据集合,其特征是: 1 ...

  8. 关于学习Python的一点学习总结(54->集合->堆->双端队列)

    集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...

  9. Python数据结构学习笔记——队列和双端队列

    目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...

最新文章

  1. 【TensorFlow2.0】(6) 数据统计,范数、最值、求和、均值、最值位置、唯一值、张量比较
  2. SpringBoot中自定义Banner(启动图案)
  3. python快速安装pip
  4. 5g虚拟技术旅游_5G赋能VR产业变革
  5. 通过js让页面中的元素上下居中的写法
  6. pytorch选出数据中的前k个最大(最小)值及其索引
  7. LIBGDX游戏引擎平台介绍与搭建
  8. Error: Could not find or load main class org.elasticsearch.tools.JavaVersionChecker
  9. Github上的版本和本地版本冲突的解决方法
  10. asp.net mysql helper_asp.net使用SQLHelper操作数据库
  11. 为什么我们需要再给 Firefox 一次机会?
  12. Hive已死,SparkSQL来啦~
  13. 休宁天气预报软件测试,【休宁天气预报】休宁今天天气预报 - 天气史
  14. LabVIEW Arduino ZigBee无线气象站(项目篇—3)
  15. 合作博弈网页小游戏-Js源码
  16. 【零基础】speech driven animation中文安装使用指南
  17. 副高相当于副处吗_事单副高职称相当于副处待遇?别逗了,连公务员副科实职都不如...
  18. 北京城市总体规划 (2016年—2035年)高清大图
  19. 骑行318、 2016.7.27
  20. 数字图像处理——红眼去除(Python)

热门文章

  1. linux上最好用的sh --zsh
  2. TOJ_1003题解
  3. 网络安全系列之九 WAF的基本配置
  4. webpack dev server 和 sublime text 配合时需要注意的地方
  5. Mysql不需要身份验证便可远程连接故障
  6. Cocos2d-精灵的几个常识
  7. PetShop 4.0讨论专贴(QA)
  8. 数据库表的软硬关联_数据库软删除和硬删除
  9. C语言指针高级部分:void指针和数据指针
  10. 以太网、局域网、互联网区别