Python实现队列

2023-10-26

Python实现队列

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

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

一、实现顺序队列

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

# coding=utf-8
class SequenceQueue(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:
            print('|' + member, end='')
        print()

    def enter(self, data):
        self.__members.insert(0, data)

    def 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]

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

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

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

show(): 展示顺序队列中的数据,也就是将队列中所有的数据依次打印输出。对存储数据的列表遍历输出即可,为了展示得更形象一点,我在队尾(入队的一端)打印竖线,表示不能从这一端取数据。

enter(data): 入队,也就是将数据添加到队列中。如果将列表的开头当成队尾,则入队可以调用列表的 insert(0, data) 方法。如果将列表的结尾当做队尾,则入队可以调用列表的 append(data) 方法。

outer(): 出队,也就是将数据从队列中取出,并将取出的数据返回。如果将列表的结尾当成队头,则出队可以直接调用列表的 pop() 方法,弹出并返回列表的最后一个数据。如果将列表的开头当做队头,则调用列表的 pop(0) 方法实现出队。

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

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

if __name__ == '__main__':
    sq = SequenceQueue()
    print("is_empty: ", sq.is_empty())
    sq.show()

    sq.enter('u')
    sq.enter('v')
    sq.enter('x')
    sq.enter('y')
    sq.enter('z')
    sq.show()
    print(sq.outer())
    sq.show()

    print("sequence queue length: ", sq.length())
    print("index member is: ", sq.check(2))

运行结果:

is_empty:  True
队列为空
|z|y|x|v|u
u
|z|y|x|v
sequence queue length:  4
index member is:  x

二、实现链队列

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

class Node(object):

    def __init__(self, data):
        self.data = data
        self.next = None

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

class LinkQueue(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 enter(self, data):
        node = Node(data)
        node.next = self.__head
        self.__head = node

    def 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

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

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

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

show(): 展示链队列中的数据,也就是将队列中所有的数据依次打印输出。对存储数据的链表遍历输出即可,为了展示得更形象一点,我在队尾(入队的一端)打印竖线,表示不能从这一端取数据。

enter(data): 入队,也就是将数据添加到队列中。如果将链表的开头当成队尾,则入队就是在链表头添加节点。如果将链表的结尾当成队尾,则入队就是在链表尾添加节点。

outer(): 出队,也就是将数据从队列中取出,并将取出的数据返回。如果将链表的结尾当成队头,则出队就是删除并返回链表尾节点的数据。如果将链表的开头当做队头,则出队就是删除并返回链表头节点的数据。

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

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

    lq = LinkQueue()
    print("is_empty: ", lq.is_empty())
    lq.show()

    lq.enter('U')
    lq.enter('V')
    lq.enter('X')
    lq.enter('Y')
    lq.enter('Z')
    lq.show()
    print(lq.outer())
    lq.show()

    print("link queue length: ", lq.length())
    print("index member is: ", lq.check(2))

运行结果:

is_empty:  True
队列为空
|Z|Y|X|V|U
U
|Z|Y|X|V
link queue length:  4
index member is:  X

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

 

 

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

Python实现队列 的相关文章

  • 使用supervisor使Laravel的queue保持后台常驻

    我的个人博客 逐步前行STEP 一 安装supervisor 1 yum install python setuptools 2 easy install supervisor 二 配置supervisor 1 echo superviso
  • rocketMQ记录

    https segmentfault com a 1190000017841402 停止命令 sh bin mqshutdown namesrv sh bin mqshutdown broker
  • 多重背包问题大全(超详细)

    题目 有N种物品和一个容量为V的背包 第i种物品最多有n i 件可用 每件费用是c i 价值是w i 求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量 且价值总和最大 首先多重背包问题可以转换为01背包来解决 关键就是如何转换 我
  • 两个栈实现一个队列(图解),一看就懂

    两个栈实现一个队列 要想实现此方法 我们现需要了解一下什么是栈和队列 栈 栈 Stack是一种只能在一端进行插入或删除操作的线性表 表中允许进行插入 删除操作的一端称为栈顶 Top 栈顶的当前位置是动态的 栈顶的当前位置是由一个称为栈顶指针
  • Java用链表实现队列

    链表实现队列 public class LinkedQueue class Node int val Node next public Node int val this val val public Node int val Node n
  • Redis生存时间TTL

    文章目录 为什么要设置key生存时间 设置key的生存时间 访问key的生存时间 清除生存时间 毫秒级时间 为什么要设置key生存时间 设置key的生存时间 可以用于以下使用场景 在登录网站后 将用户session存储在内存 设置一个过期时
  • 多线程爬虫快速上手

    多线程爬虫 在实现网页爬虫的时候 经常会因为代理问题掉线导致爬虫失败 还又很多时候下载的文件略大 比如下载图片 因为下载图片是一个耗时的操作 如果采用之前那种同步的方式下载 那效率肯会特别慢 这时候我们就可以考虑使用多线程的方式来下载图片
  • 一文快速了解进程、线程与协程

    进程与线程 进程是操作系统进行资源分配的基本单位 每个进程都有自己的独立内存空间 由于进程比较重量 占据独立的内存 所以上下文进程间的切换开销 栈 寄存器 虚拟内存 文件句柄等 比较大 但相对比较稳定安全 线程又叫做轻量级进程 是进程的一个
  • 关于 栈 和 队列,你还在犯迷糊吗?

    我是目录 1 队列 1 Queue 队列 2 Deque 双向队列 2 栈 从数据结构角度来看 栈 和 队列 都是一种特殊的线性结构 只是对 插入 删除 元素的方式做了限制 栈 先进后出 push pop peek 的时间复杂度都是 O 1
  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表
  • Python二叉树的三种深度优先遍历

    Python二叉树的三种深度优先遍历 一 广度优先遍历和深度优先遍历 对二叉树进行遍历 traversal 是指依次对树中每个节点进行访问 在遍历的过程中实现需要的业务 对树的遍历方式有广度优先遍历和深度优先遍历两种方式 广度优先一般用队列
  • java中常用的队列

    一 java中的队列 Queue 基本上 一个队列就是一个先入先出 FIFO 的数据结构 Queue接口与List Set同一级别 都是继承了Collection接口 LinkedList实现了Deque接口 二 非阻塞队列 非阻塞队列不能
  • (十三):图

    1 图的基本介绍 1 1为什么要有图 前面我们学到了线性表和树 线性表局限于直接前驱和一个直接后继结点的关系 树也只能有一个直接前驱也就是父节点 当我们需要多对多关系时候 就需要图 1 2图的举例说明 图是一种数据结构 其中结点可以具有零个
  • LeetCode 232. 用栈实现队列

    题目链接 https leetcode cn problems implement queue using stacks 栈的特点是先进后出 而队列的特点是先进先出 我们用两个栈正好能把顺序反过来实现类似队列的操作 stackData 作为
  • C/C++队列操作

    1 链队结构 typedef struct queuenode int data struct queuenode next Queue typedef struct Queue fronts rear linkqueue 2 入队操作 进
  • 关于电商秒杀系统中防超卖、以及高性能下单的处理方案简述

    秒杀抢购系统的成功平稳运行 有一些需要注意的知识点 1 高并发 以及刷接口等黑客请求对服务端的负载冲击 2 高并发时带来的超卖 即商品数量的控制 3 高负载下 下单的速度和成功率的保证 4 其他 以秒杀单品为例 如抢小米手机 解决方案探讨
  • 剑指 Offer 09. 用两个栈实现队列

    题目链接 09 用两个栈实现队列 思路分析 用两个栈实现队列 首先把1 gt 2然后逐个弹出顶端元素 class CQueue public stack
  • 剑指 Offer 32 - II. 从上到下打印二叉树 II

    剑指 Offer 32 II 从上到下打印二叉树 II 题目 题目链接 解题思路 具体思路 具体代码 题目 题目链接 https leetcode cn com problems cong shang dao xia da yin er c
  • fcfs调度算法_使用C程序实现先到先服务(FCFS)CPU调度算法

    fcfs调度算法 CPU scheduling decides which of the available processes in the ready queue is to be allocated the CPU There are
  • 《算法图解》总结第 6 章:广度优先搜索

    仅用于记录学习 欢迎批评指正 大神勿喷 系列文章目录 算法图解 总结第 1 章 二分查找 大O表示法 算法图解 总结第 2 章 数组和链表 选择排序 算法图解 总结第 3 章 while循环 递归 栈 算法图解 总结第 4 章 分而治之 快

随机推荐

  • Android调用打印机

    打印机其实和Android没有什么大的关系 和linux内核关联才是比较强的 最终的结果是要在Android实现驱动打印机 但是一般调试一个新的驱动的流程是这样的 1 先在linux PC上进行测试 2 在标准嵌入式linux上进行调试 3
  • MFC原理与方法(二)

    MFC原理与方法 二 一 前言 二 类向导的使用 三 MFC消息管理 1 MFC消息映射机制 2 消息处理 四 结语 一 前言 时间过得好快啊 又是一个星期过去了 我又回来啦 每个星期保持写博客的习惯 及时消化上课的知识 不仅仅对我有帮助和
  • MySQL进阶篇之存储过程(procedure)

    04 视图 存储过程 触发器 4 1 视图 view 4 2 存储过程 procedure 4 2 1 介绍 1 介绍 存储过程是事先经过编译并存储在数据库中的一段SQL语句的集合 调用存储过程可以简化应用开发人员的很多工作 减少数据在数据
  • 异常处理的返回

    异常处理的返回 异常可以分为四类 中断 interrupt 陷阱 trap 故障 fault 和终止 abort 这几种异常处理之后又有不同的返回方式 总的来讲 类别 原因 异步 同步 返回行为 中断 来自I O设备的信号 异步 总是返回到
  • 面试3个月拿下多家大厂的P7技术专家Offer,来看我面试复盘!

    一 概述 之前写过两篇文章 工作10年我面试过上百个程序员 真想对他们说 在公司里写代码天天摸鱼偷懒 出去面试又该怎么写简历 通过这两篇文章 我们给大家聊了聊国内中大型互联网公司 在Java面试时一些高频的技术问题 本文我们通过一篇真实的一
  • 【状态估计】用于非标量系统估计的最优卡尔曼滤波(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 考虑了最优卡尔曼滤波的例子 假设一些非标量
  • vscode运行命令是报错:标记“&&”不是此版本中的有效语句分隔符。

    问题截图 问题原因 这个问题的原因和你运行的什么脚本语言没关系 即与 py c cpp无关 和你在那个终端运行的有关 解决方法 第一步 点击向下箭头 并选择 选择默认配置文件 第二步 选择 Windows PowerShell 第三步 关闭
  • 数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

    前言 本专栏旨在记录高频笔面试手撕代码题 以备数字前端秋招 本专栏所有文章提供原理分析 代码及波形 所有代码均经过本人验证 目录如下 1 数字IC手撕代码 分频器 任意偶数分频 2 数字IC手撕代码 分频器 任意奇数分频 3 数字IC手撕代
  • 2021羊城杯CTF wp

    2021羊城杯 部分 wp Web web1 only 4 web2 EasyCurl web3 Checkin Go web4 Cross The Side Re Pwn BabyRop Crypto Miss bigrsa Misc M
  • FISCO-BCOS如何把WEBASE部署通过的合约方法由api在前端调用

    参考文章 fisco bcos官方文档第五章部分 通过POST请求 数据格式要为json 调用hello合约中的get方法 按要求填写需要的信息
  • 决策树的学习

    决策树 从名字上看 就知道其模型的结构为树结构 决策树既可以用于分类 也可以用于回归之中 在分类问题中 我们可以认为其是if then规则的集合 也可以认为是定义在特征空间与类空间上的条件概率分布 在学习过程中 利用训练数据和损失函数最小化
  • 因果推理的do算子

    在因果推理中 我们一般都需要首先构建一个因果图 这是后续进行因果分析的基础 但是在现阶段笔者的知识看来 因果图的构建其实是一个比较主观的过程 但偏偏又是后续分析的基础 所以略感头疼 在构建因果图前 我们有必要明白 什么是因果关系 通俗来说
  • 【JUC并发编程】

    本笔记内容为狂神说JUC并发编程部分 目录 一 什么是JUC 二 线程和进程 1 概述 2 并发 并行 3 线程有几个状态 4 wait sleep 区别 三 Lock锁 重点 四 生产者和消费者问题 五 八锁现象 六 集合类不安全 七 C
  • 统计字符串中,中文字符、英文字符和数字字符的数量

    package com suanfa public class ZYSTotal 统计字符串中 中文字符 英文字符和数字字符的数量 public static void main String args int englishCount 0
  • 指针和数组的相关练习题

    目录 一 一维数组 二 字符数组 三 二维数组 注意 假设本练习题所用的VS编译器是64位平台下的 首先要明白数组名的意义 1 sizeof 数组名 这里的数组名表示整个数组 计算的是整个数组的大小 2 数组名 这里的数组名表示整个数组 取
  • 帆软之图表详解

    帆软之图表详解 饼图 饼图 玫瑰图 玫瑰图和饼图类似 仅选择不同的图例即可 多分类饼图 注 标题居中不是直接显示标题居中 而是隐藏标题偶按照下面的方法将标题加上去 柱状图 柱状图设置柱子宽度 boby 样式 系列 固定柱宽 注意事项 问题描
  • 4.3寸串口屏在智能炒菜机上应用分享

    现代人追求高效品质生活的美好愿望以及社会科技的不断发展持续推动着一种新兴经济形态的出现 即懒人经济 懒人经济的崛起也成为智能家电行业新的增长引擎 自动炒菜机便是这一经济形态下的产物 对于很多居住于快节奏生活的一二线城市人来说 在辛苦工作一整
  • vue3 递归无限分类树型菜单+搜索功能

    我们先来看一下大致实现效果 数据可以无限向下增加 搜索关键字会自动展开数据 vue3树形结构菜单 搜索 首先我这个需要自己设计数据源 一定要先搞清楚数据是什么结构才能顺利开展下一步 有接口的同学可以忽略这一步 其中children顾名思义
  • 区块链是如何做到交易记录不可被篡改的

    区块链是如何做到交易记录不可被篡改的 星目 关注 2017 07 19 23 03 字数 1912 阅读 1654评论 4喜欢 1 BlockChain 比特币前一阵子一度超过2万元一枚 而且长期来看这远远不是它的极限 假如你手里有比特币
  • Python实现队列

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