Python实现双端队列

关于双端队列的介绍,请参考:https://blog.csdn.net/weixin_43790276/article/details/104033337

双端队列的数据存储结构可以是顺序表,也可以是链表,本篇文章使用 Python 来分别实现顺序双端队列和链双端队列。

一、实现顺序双端队列

顺序双端队列是使用顺序表存储数据的双端队列,Python 中的列表元组都属于顺序表,下面使用列表来存储数据,实现顺序双端队列。

# coding=utf-8
class SequenceDoubleQueue(object):def __init__(self):self.__members = list()def is_empty(self):return not len(self.__members)def show(self):if self.is_empty():print('双端队列为空')returnfor member in self.__members:if self.__members.index(member) != len(self.__members)-1:print(member, end='|')else:print(member)def head_enter(self, data):self.__members.insert(0, data)def end_enter(self, data):self.__members.append(data)def head_outer(self):if self.is_empty():returnreturn self.__members.pop(0)def end_outer(self):if self.is_empty():returnreturn self.__members.pop()def length(self):return len(self.__members)def check(self, index):if index < 0 or index > len(self.__members)-1:raise IndexErrorreturn self.__members[index]

定义一个 SequenceDoubleQueue() 类,实例化的时候会创建一个空列表,生成一个空的顺序双端队列。 Python 中的列表有很多自带的方法,所以将存储数据的列表设置成私有属性,避免用户在类外面链式调用列表的其他方法。如果用户直接在类外面操作列表,则双端队列只能从两端存取数据的规则可能会被破坏。

下面是顺序双端队列的各个方法实现:

is_empty(): 判断顺序双端队列是否为空。如果存储数据的列表长度为零(对应布尔值False),则顺序双端队列为空(is_empty为True),反之。

show(): 展示顺序双端队列中的数据,也就是将双端队列中所有的数据依次打印输出,对存储数据的列表遍历输出即可。

head_enter(data): 前端入队,也就是从队列的前端添加数据到队列中。在本文中,统一将列表的开头当成双端队列的前端,列表的结尾当成双端队列的后端。前端入队调用列表的 insert(0, data) 方法即可。

end_enter(data): 后端入队,也就是从队列的后端添加数据到队列中。后端入队调用列表的 append(data) 方法即可。

head_outer(): 前端出队,也就是从队列中取出前端的数据,并将取出的数据返回。前端出队调用列表的 pop(0) 方法即可。

end_outer(): 后端出队,也就是从队列中取出后端的数据,并将取出的数据返回。后端出队调用列表的 pop() 方法即可。

length(): 返回顺序双端队列的长度。顺序双端队列的长度就是存储数据的列表长度。

check(index): 返回顺序双端队列中指定位置的数据。根据指定的 index 值,将存储数据的列表中对应索引的数据返回即可。

if __name__ == '__main__':sdq = SequenceDoubleQueue()print("is_empty: ", sdq.is_empty())sdq.show()sdq.head_enter('x')sdq.head_enter('y')sdq.head_enter('z')sdq.end_enter(10)sdq.end_enter(20)sdq.end_enter(30)sdq.show()print(sdq.head_outer())print(sdq.end_outer())sdq.show()print("sequence double queue length: ", sdq.length())print("index member is: ", sdq.check(2))

运行结果:

is_empty:  True
双端队列为空
z|y|x|10|20|30
z
30
y|x|10|20
sequence double queue length:  4
index member is:  10

二、实现链双端队列

链双端队列是使用链表存储数据的双端队列,链表是逻辑有序的,由一个一个的节点构成,所以先声明一个创建节点的类。

class Node(object):def __init__(self, data):self.data = dataself.next = None

下面按照单向链表的方式来实现链双端队列。

class LinkDoubleQueue(object):def __init__(self):self.__head = Nonedef is_empty(self):return not self.__headdef show(self):if self.is_empty():print('双端队列为空')returncur = self.__headwhile cur is not None:if cur.next is not None:print(cur.data, end='|')else:print(cur.data)cur = cur.nextdef head_enter(self, data):node = Node(data)node.next = self.__headself.__head = nodedef end_enter(self, data):if self.is_empty():self.head_enter(data)returnnode = Node(data)cur = self.__headwhile cur.next is not None:cur = cur.nextcur.next = nodedef head_outer(self):if self.is_empty():returncur = self.__headself.__head = self.__head.nextreturn cur.datadef end_outer(self):if self.is_empty():returncur = self.__headprev = Nonewhile cur.next is not None:prev = curcur = cur.nextif cur == self.__head:self.__head = self.__head.nextreturnprev.next = cur.nextreturn cur.datadef length(self):length = 0cur = self.__headwhile cur is not None:length += 1cur = cur.nextreturn lengthdef check(self, index):if index < 0 or index >= self.length():raise IndexErrorcur = self.__headfor _ in range(index):cur = cur.nextreturn cur.data

定义一个 LinkDoubleQueue() 类,实例化的时候会创建一个空链表,生成一个空的链双端队列。

下面是链双端队列的各个方法实现:

is_empty(): 判断链双端队列是否为空。如果存储数据的链表头指向空(对应布尔值False),则链双端队列为空(is_empty为True),反之。

show(): 展示链双端队列中的数据,也就是将双端队列中所有的数据依次打印输出,对存储数据的链表遍历输出即可。

head_enter(data): 前端入队,也就是从队列的前端添加数据到队列中。在本文中,统一将链表的头当成双端队列的前端,链表的尾当成双端队列的后端。前端入队就是从链表头部添加节点。

end_enter(data): 后端入队,也就是从队列的后端添加数据到队列中。后端入队就是从链表尾部添加节点。

head_outer(): 前端出队,也就是从队列中取出前端的数据,并将取出的数据返回。前端出队就是删除并返回链表头节点的数据。

end_outer(): 后端出队,也就是从队列中取出后端的数据,并将取出的数据返回。后端出队就是删除并返回链表尾节点的数据。

length(): 返回链双端队列的长度。链双端队列的长度就是存储数据的链表长度。

check(index): 返回链双端队列中指定位置的数据。根据指定的 index 值,找到并返回链表中对应位置的节点数据。

    ldq = LinkDoubleQueue()print("is_empty: ", ldq.is_empty())ldq.show()ldq.head_enter('X')ldq.head_enter('Y')ldq.head_enter('Z')ldq.end_enter(100)ldq.end_enter(200)ldq.end_enter(300)ldq.show()print(ldq.head_outer())print(ldq.end_outer())ldq.show()print("link queue length: ", ldq.length())print("index member is: ", ldq.check(2))

运行结果:

is_empty:  True
双端队列为空
Z|Y|X|100|200|300
Z
300
Y|X|100|200
link queue length:  4
index member is:  100

以上就是用 Python 实现的顺序双端队列及链双端队列。

Python实现双端队列相关推荐

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

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

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

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

  3. 用Python实现双端队列

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

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

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

  5. python 实现双端队列

    # 队列两端都可以进行push和pop操作. push操作可以用循环双端链表的append,appendleft. # pop操作使用循环双端链表的romoveclass Node(object): ...

  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. 独家 | 教你使用torchlayers 来构建PyTorch 模型(附链接)
  2. Qt Creator设置Qbs
  3. postman测试工具,如何对参数使用md5加密
  4. Atitit.编程语言的基础句型and汉语英文比较
  5. 苍狼敏捷软件开发团队建设指南-2-团队建设
  6. 多卡聚合路由器在视频直播中的解决方案
  7. 翻译软件Bob安装教程
  8. 淘宝内乱持续 QQ盛大京东“趁火打劫”
  9. 深入理解正向代理和反向代理
  10. 一次安装IE11浏览器的经历
  11. 应届毕业生外包公司体验
  12. 漫谈核心能力(2) -- 知错能改,善莫大焉
  13. 【高效程序员系列】别碰鼠标——让键盘飞起来
  14. svn查看ip linux,查看svn服务器的ip地址
  15. 使用bedtools进行gwas基因注释
  16. vue引入第三方原生js库
  17. 修改Jupyter Notebook文件默认保存路径
  18. 毕业之后所有面试总结
  19. dubbox2.8.4框架的搭建步骤
  20. 征女友(搞笑)(转)

热门文章

  1. angular6--创建项目
  2. Linux 汇编学习
  3. AR-关于几种特殊的收款方式说明
  4. 迷宫(AHOI2016初中组T3)
  5. php安装zendDebug
  6. 部署SCVMM2012 SP1 集群(1)---部署AD
  7. 变形金刚热映黑客借机“下毒” 用户谨防木马
  8. Linux中文件查找技术大全
  9. frp + nginx 配置多人共用的http 内网穿透服务
  10. 常用JS库源码 - store.js源码/underscore.js源码