Python实现双端队列
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实现双端队列相关推荐
- python deque双端队列的神奇用法
python中的deque双端队列,类似list的任意一端都可实现较快的add和pop操作 from collections import dequed=deque(maxlen=20) for i ...
- [转载] Python的双端队列deque
参考链接: Python中的双端队列DeQue Python的强大并不在于它的语法,而在于它的库,当你对各种数据结构感到苦恼时,Python提供了各种开箱即用的数据结构. 数据结构中最常讲授的数据结构 ...
- 用Python实现双端队列
双端队列 双端队列(deque,全名double-ended queue),是⼀种具有队列和栈的 性质的数据结构. 双端队列中的元素可以从两端弹出,其限定插⼊和删除操作在表的两端进 ⾏.双端队列可以在 ...
- 用Python的双端队列deque实现非常简单的大富翁地图
一.双端队列简介 双端队列有一个方法是rotate.可以把数据想成一个圆环,rotate能让它转起来,转多少,取决于我们给的参数.参数为正整数,那就顺时针旋转,为负整数则逆时针旋转. from col ...
- python 实现双端队列
# 队列两端都可以进行push和pop操作. push操作可以用循环双端链表的append,appendleft. # pop操作使用循环双端链表的romoveclass Node(object): ...
- Python利用双端队列判断回文词
#默认右端为队首 class Deque:def __init__(self):self.items = []def isEmpty(self):return self.items == []def ...
- 数据结构与算法(Python版) | (6) 线性结构---队列、双端队列和列表
本专栏主要基于北大的数据结构与算法教程(Python版)进行整理,包括课程笔记和OJ作业. 课程链接 1. 队列抽象数据类型及Python实现 什么是队列? 队列是一种有次序的数据集合,其特征是: 1 ...
- 关于学习Python的一点学习总结(54->集合->堆->双端队列)
集合,堆,双端队列 再谈集合set:集合是由内置类set实现的 >>> set(range(10)){0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 可使用序列(或其他可 ...
- Python数据结构学习笔记——队列和双端队列
目录 一.队列的定义 二.队列 实现步骤分析 三.队列的Python实现代码 四.队列的应用 六人传土豆游戏 五.双端队列的定义 六.双端队列 实现步骤分析 七.双端队列的Python实现代码 八.双 ...
最新文章
- 独家 | 教你使用torchlayers 来构建PyTorch 模型(附链接)
- Qt Creator设置Qbs
- postman测试工具,如何对参数使用md5加密
- Atitit.编程语言的基础句型and汉语英文比较
- 苍狼敏捷软件开发团队建设指南-2-团队建设
- 多卡聚合路由器在视频直播中的解决方案
- 翻译软件Bob安装教程
- 淘宝内乱持续 QQ盛大京东“趁火打劫”
- 深入理解正向代理和反向代理
- 一次安装IE11浏览器的经历
- 应届毕业生外包公司体验
- 漫谈核心能力(2) -- 知错能改,善莫大焉
- 【高效程序员系列】别碰鼠标——让键盘飞起来
- svn查看ip linux,查看svn服务器的ip地址
- 使用bedtools进行gwas基因注释
- vue引入第三方原生js库
- 修改Jupyter Notebook文件默认保存路径
- 毕业之后所有面试总结
- dubbox2.8.4框架的搭建步骤
- 征女友(搞笑)(转)