Python实现双端队列

2023-11-01

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('双端队列为空')
            return
        for 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():
            return
        return self.__members.pop(0)

    def end_outer(self):
        if self.is_empty():
            return
        return self.__members.pop()

    def length(self):
        return len(self.__members)

    def check(self, index):
        if index < 0 or index > len(self.__members)-1:
            raise IndexError
        return 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 = data
        self.next = None

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

class LinkDoubleQueue(object):

    def __init__(self):
        self.__head = None

    def is_empty(self):
        return not self.__head

    def show(self):
        if self.is_empty():
            print('双端队列为空')
            return
        cur = self.__head
        while cur is not None:
            if cur.next is not None:
                print(cur.data, end='|')
            else:
                print(cur.data)
            cur = cur.next

    def head_enter(self, data):
        node = Node(data)
        node.next = self.__head
        self.__head = node

    def end_enter(self, data):
        if self.is_empty():
            self.head_enter(data)
            return
        node = Node(data)
        cur = self.__head
        while cur.next is not None:
            cur = cur.next
        cur.next = node

    def head_outer(self):
        if self.is_empty():
            return
        cur = self.__head
        self.__head = self.__head.next
        return cur.data

    def end_outer(self):
        if self.is_empty():
            return
        cur = self.__head
        prev = None
        while cur.next is not None:
            prev = cur
            cur = cur.next
        if cur == self.__head:
            self.__head = self.__head.next
            return
        prev.next = cur.next
        return cur.data

    def length(self):
        length = 0
        cur = self.__head
        while cur is not None:
            length += 1
            cur = cur.next
        return length

    def check(self, index):
        if index < 0 or index >= self.length():
            raise IndexError
        cur = self.__head
        for _ in range(index):
            cur = cur.next
        return 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 实现的顺序双端队列及链双端队列。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现双端队列 的相关文章

随机推荐

  • Json Path提取器

    一 Json Path提取器截图 二 Json Path提取器使用说明 http响应的Json结果如下图 数据来源 可以是Http请求的响应结果或者JMeter变量值 目标变量名和Json Path表达式 将Json Path提取出的结果存
  • 共享里的文件被删除了怎么办?可尝试这三种恢复方法

    共享里的文件被删除了怎么恢复 删除之后就马上去回收站找 可是没回收站里没有怎么办 来自某xx小伙伴的咨询 如果你也出现同样的疑惑 那么可以尝试下面的三种方法恢复共享里的文件 方法一 以前的版本恢复 从Windows XP SP2和Windo
  • python安装到一半停止_关于python:使用requirements.txt进行安装时,停止单个包上的pip失败...

    我正在安装requirements txt中的包 pip install r requirements txt requirements txt文件显示 Pillow lxml cssselect jieba beautifulsoup n
  • 外设驱动库开发笔记3:AD527x系列数字电位器驱动

    在一些时候我们需要使用精度更高的数字电位器来实现我们的应用 我们经常使用AD527x系列数字电位器来实现这类应用 在通常情况下 AD527x系列数字电位器完全能够满足要求 为了减少重复工作 在这里我们将分系并实现AD527x系列数字电位器的
  • 12月31日写成13月1日引发重大 Bug,程序员新年就要被“祭天”?

    元旦放假 宅家大扫除成了头等大事 这不 小白鲸扫地机器人竟然选择了 罢工 不少用户反馈小白鲸拖地机器人指示灯一直异常无法工作 到底是什么鬼呢 官方排查发现 是的 你没看错 Bug 原因是程序员小哥哥把 12 月 31 日写成了 13 月 1
  • C4.5算法详解(非常仔细)

    首先 C4 5是决策树算法的一种 决策树算法作为一种分类算法 目标就是将具有p维特征的n个样本分到c个类别中去 相当于做一个投影 c f n 将样本经过一种变换赋予一种类别标签 决策树为了达到这一目的 可以把分类的过程表示成一棵树 每次通过
  • VUE报错 plugin-vue requires vue (>=3.2.13) or @vue/compiler-sfc to be present in the dependency tree

    VUE运行报错 vitejs plugin vue requires vue gt 3 2 13 or vue compiler sfc to be present in the dependency tree 运行 npm install
  • [系统安全] 四十九.恶意软件分析 (5)Cape沙箱分析结果Report报告的API序列批量提取详解

    终于忙完初稿 开心地写一篇博客 您可能之前看到过我写的类似文章 为什么还要重复撰写呢 只是想更好地帮助初学者了解病毒逆向分析和系统安全 更加成体系且不破坏之前的系列 因此 我重新开设了这个专栏 准备系统整理和深入学习系统安全 逆向分析和恶意
  • android设置布局高度的属性,Android内部分享[9]——约束布局 ConstraintLayout 的使用...

    ConstraintLayout 允许您创建具有平面视图层次结构 没有嵌套视图组 的大型复杂布局 它类似于 RelativeLayout 因为所有视图都是根据兄弟视图和父视图布局之间的关系来布局的 但是它比 RelativeLayout 更
  • 移动机器人定位(amcl)

    1 定位 amcl 1 1找到amcl自带功能包 amcl diff launch
  • 使用Python调用百度地图的API在地图上添加标记

    写在前面 近期博主工作太忙 快一个月没更新博客 今天跑了大半天的腿 被一堆破事儿弄的无比憋屈 写篇博客调节一下心情 博主的目的是在地图上做一些标记 然后保存为html网页文件 这样方便我的软件调用 前期我使用的folium包 这个包很强大
  • Kylin ext3/4 xfs手动扩容根分区

    1 环境 云平台 兼容OpenStack Queens的发行版 HOST OS Kylin Server 10 SP1 Release Build20 20210518 arm64 虚拟机镜像ISO Kylin Server V10 GFB
  • Flask-模板

    视图函数的作用是生成请求的响应 但是直接在视图函数里处理业务逻辑和表现逻辑 会显的代码混乱 可以把表现逻辑移到模板中 模板是包含响应文本的文件 其中包含用占位变量表示的动态部分 其具体值只在请求的上下文中才能知道 使用真实值替换变量 再返回
  • IT行业相关技术介绍

    IT行业常见技术体系 一 前端开发 前端开发是创建WEB页面 网页 或APP等前端界面呈现给用户的过程 通过HTML CSS JavaScript以及衍生出来各种技术 框架 来实现互联网产品的用户界面交互 1 核心技术 1 HTML 网页的
  • Gitlab详细使用说明

    1 下载安装 下载gitlab和安装就不用详细说了 下载可以到官网下载 官网下载速度慢的 可以到我网盘下载 网盘地址链接 https pan baidu com s 1LZ6wq0PZNyB5SzGAzd74ew 提取码 uccq 2 使用
  • Vant库的使用,及日期组件的一些注意点

    Vant库对于开发商城类项目 真的是非常nice 会让你情不自禁爱上它 Vant库支持按需加载 为移动端商城设计的风格 非常完美 但是 本人在实际开发中 也遇到了一些小问题 折腾了老半天 最终得以解决 下面先说说在vue中使用Vant库的流
  • 小米2022春招内推

    小米2022春招内推 内推码 DSpvRGae 登录小米招聘官网http campus hr xiaomi com 投递简历时填入内推码 或者直接微信扫描下方二维码投递 2022春季补招或2023届实习可投递 岗位类型 研发 产品 设计 运
  • 【Python】Pycharm中The file size exceeds the configured limit 的解决方法

    文章目录 问题描述 解决方案 问题描述 用PyCharm打开较大文件的时候 出现错误提示 The file size 11 42 MB exceeds the configured limit 2 56 MB Code insight fe
  • 数据结构与算法—二分查询

    一 二分查询的概念 二 算法思想 程序的非递归实现 int binaryFind int nums int n int key int left 0 right n 1 int mid 0 int pos 1 while left lt r
  • Python实现双端队列

    Python实现双端队列 关于双端队列的介绍 请参考 https blog csdn net weixin 43790276 article details 104033337 双端队列的数据存储结构可以是顺序表 也可以是链表 本篇文章使用