数据结构与算法——队列(python版附带详细例子)

裘宗燕-数据结构与算法python描述笔记(队列) 裘宗燕-数据结构与算法python描述笔记(队列):队列的实现以及迷宫问题的求解 阅读详情
AI摘要

本文深入探讨了队列和双端队列这两种基本数据结构,详细介绍了它们的操作方法,包括插入、删除和查询等,并提供了Python实现的代码示例。同时,通过约瑟夫问题展示了队列的实际应用。


author:xiao黄
缓慢而坚定的生长


单向队列

队列也是一种基本的数据结构,在队列中的插入和删除都遵循先进先出(First in First out, FIFO)的原则。元素可以在任何时刻进行插入,但是只有在队列最前面的元素才能被删除。
通常将队列中允许插入的一端称为队尾,将允许删除的一端称为队头。

队列的抽象数据类型

对于队列Q而言,有下面的一些基本的方法:

  • Q.enqueue(x):向队列Q的队尾添加一个元素;
  • Q.dequeue():从队列Q中移除并返回第一个元素,如果队列为空,则触发一个错误;
  • Q.first():返回队列Q中的第一个元素,但并不删除该元素,如果队列为空,则触发一个错误;
  • Q.len():返回队列Q中元素的数量;
  • Q.isEmpty():如果队列Q没有包含任何元素,则返回"True",否则返回"False"。

下面用一个表格来讲解一下队列的基本操作:
在这里插入图片描述

基于数组的队列实现

通过使用python列表来实现一个队列。
先上简化版的队列代码:

class ArrayQueue:
    # 创建一个先入先出的队列

    def __init__(self):
        # 创建一个空队列
        self._items = []
    
    def isEmpty(self):
        # 如果队列为空则返回'True'
        return len(self._items) == 0
    
    def enqueue(self, x):
        # 向队列尾部添加元素x
        self._items.insert(0,x)

    def dequeue(self):
        # 移除第一个元素并返回
        # 如果队列为空,则触发一个错误
        if self.isEmpty():
            raise Exception('Queue is empty')
        return self._items.pop()
    
    def len(self):
        # 返回队列中元素的数量
        return len(self._items)

    def first(self):
        # 返回队列中第一个元素,但并不移除
        # 如果队列为空,则触发一个错误
        if self.isEmpty():
            raise Exception('Queue is empty')
        return self._items[-1]

下面介绍一个较为复杂一点的版本,代码如下:

  • self._data:指一个固定容量的列表实例;
  • self._size:整数,代表当前存储在队列中元素的数量;
  • self._front:整数,代表实例队列中第一个元素的索引;
class ArrayQueue:
    # 创建一个先入先出的队列
    DEFAULT_CAPACITY = 10 # 新队列的初始容量

    def __init__(self):
        # 创建一个空队列
        self._data = [None] * ArrayQueue.DEFAULT_CAPACITY
        self._size = 0
        self._front = 0
    
    def isEmpty(self):
        # 如果队列为空则返回'True'
        return self._size == 0
    
    def enqueue(self, x):
        # 向队列尾部添加元素x
        if self._size == len(self._data):
            self._resize(2 * len(self._data))
        avail = (self._front + self._size) % len(self._data)
        self._data[avail] = x
        self._size += 1

    def dequeue(self):
        # 移除第一个元素并返回
        # 如果队列为空,则触发一个错误
        if self.isEmpty():
            raise Exception('Queue is empty')
        answer = self._data[self._front]
        self._data[self._front] = None
        self._front = (self._front + 1 ) % len(self._data)
        self._size -= 1
        return answer
    
    def len(self):
        # 返回队列中元素的数量
        return self._size

    def first(self):
        # 返回队列中第一个元素,但并不移除
        # 如果队列为空,则触发一个错误
        if self.isEmpty():
            raise Exception('Queue is empty')
        return self._data[self._front]
    
    def _resize(self,cap):
        # 改变列表的容量
        old = self._data
        self._data = [None] * cap
        walk = self._front
        for i in range(self._size):
            self._data[i] = old[walk]
            walk = (1+walk) % len(old)
        self._front = 0

添加和删除元素:
利用下面的公式计算下一个插入的位置:

avail = (self._front + self._size) % len(self._data)

因为有可能当前队列的长度为3,且第一个元素所在的索引为5,在这个队列中已有的3个元素存储位置即为索引5、6和7,故新的元素应该被放置在8的位置。
当调用dequeue操作时,self._front的当前值指明要被删除,利用一个本地变量answer存储当前要删除的值,并且设self._data[self._front]=None。然后更新self._front和self._size,最后返回要删除的值。

例子-约瑟夫问题(单向队列实现)

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。
代码如下:

def fun(n,m):
    s = ArrayQueue()
    for i in range(1,n+1):
        s.enqueue(i) # 先把全部入队
    while s.len() > 1:
        for i in range(1,m):
            s.enqueue(s.dequeue()) # 不是第m个继续入队
        print(s.dequeue()) # 第m个就出队
    return s.dequeue()

运行结果如下:
在这里插入图片描述

双端队列

双端队列(double-ended queue 或者deque)支持在队列的头部和尾部进行插入的删除操作。
双端队列D的一些基本方法:

  • D.add_first(x):向双端队列的前面添加一个元素x;
  • D.add_last(x):向双端队列的后面添加一个元素x;
  • D.delete_first():从双端队列中移除并返回第一个元素,如果队列为空,则触发一个错误;
  • D.delete_last():从双端队列中移除并返回最后一个元素,如果队列为空,则触发一个错误;
  • D.first():返回(但不移除)双端队列的第一个元素,如果队列为空,则触发一个错误;
  • D.last():返回(但不移除)双端队列的最后一个元素,如果双端队列为空,则触发一个错误;
  • D.isEmpty():如果双端队列不包含任何一个元素,则返回’True’,否则返回’Fasle’;
  • D.len():返回当前双端队列中的元素个数。

下面通过一个表格来讲解一下双端队列:
在这里插入图片描述

详细代码如下:

class Deque:
    # 创建一个双端队列对象
    def __init__(self):
        # 创建一个双端队列
        self.items = []

    def isEmpty(self):
        # 双端队列是否为空
        return self.items == []

    def add_first(self,x):
        # 在双端队列头部添加元素
        self.items.append(x)

    def add_last(self,x):
        # 在双端队列尾部添加元素
        self.items.insert(0,x)
    
    def delete_first(self):
        # 删除双端队列头部的元素并返回
        # 如果双端队列为空,则触发一个错误
        if self.isEmpty:
            raise Exception('Deque is empty')
        return self.items.pop()

    def delete_last(self):
        # 删除双端队列尾部的元素并返回
        # 如果双端队列为空,则触发一个错误
        if self.isEmpty:
            raise Exception('Deque is empty')
        return self.items.pop(0)
    
    def len(self):
        # 返回双端队列的元素的数量
        return len(self.items)
    
    def first(self):
        # 返回但不移除双端队列的第一个元素
        # 如果双端队列为空,则触发一个错误
        if self.isEmpty:
            raise Exception('Deque is Empty')
        return self.items[-1]
    
    def last(self):
        # 返回但不移除双端队列的最后一个元素
        # 如果双端队列为空,则触发一个错误
        if self.isEmpty:
            raise Exception('Deque is empty')
        return self.items[0]

数据结构与算法Python版之北大慕课笔记(一) 数据结构与算法一、“变位词”判断问题1. 解法一:逐字检查2. 解法二:排序比较3. 解法三:计数比较二、线性结构linear structure1. 四个线性结构2. 栈的应用三、表达式转换及求值1. 中缀表达式2. 前缀和后缀表达式3. 中缀转换为前缀/后缀表达式3.1 通用的中缀转后缀算法4. 后缀表达式求值 一、“变位词”判断问题 问题描述:变位词是指两个词之间存在组成字母的重新排列关系。... 阅读详情

相关推荐

【Python数据结构与算法笔记day01】数据结构与算法(Python)

文章目录数据结构与算法(Python)Why? 数据结构与算法(Python) Python数据结构与算法 1. 引入概念 1.1. 第一次尝试 1.2. 算法的提出 1.3. 第二次尝试 1.4. 算法效率衡量 1.5. 算法分析 1.6. 常见时间复杂度 1.7. Python内置类型性能分析 1.8. 数据结构 2. 顺序表 2.1. 顺序表的形式 2.2. 顺序表的结构与实现 2.3. ...

汪雯琦的博客 1273

python数据结构和算法汇总

1. BFS和DFS: 用Python实现树的BFS与DFS [Python] BFS和DFS算法(第1讲)

AI科技前线 259

数据结构与算法(一)(Python版)

一个实验室,在任意的一个小时内,大约有10名学生在场,这一小时中,每人会发起2次左右的打印,每次1~20页。由链表结构我们知道要访问到整条链上的所有数据项,都必须从表头head开始沿着next链接逐个向后查找,所以添加新数据项最快捷的位置是表头,整个链表的首位置。由于无序表并没有限定数据项之间的顺序,新数据项可以加入到原表的任何位置按照实现的性能考虑,应添加到最容易加入的位置上。2. 同一个算法,采用不同的编程语言编写,放在不同的机器上运行,得到的运行时间会不一样,有时候会大不一样。

m0_55854679的博客 1192

在路上---学习篇(一)Python 数据结构和算法 (1)

数据结构和算法 现阶段的肤浅理解数据结构是各式各样的类型数据在内存中是如何构造的,原理是怎么样的。 了解了其本质后,在面对问题时候,根据数据结构利用算法计算可以最快,最有效的完成任务。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。这些需要我自己不断主动的学习和积累! 算法的概念 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的...

weixin_30492047的博客 277

Python数据结构与算法(3.3)——队列

栈和队列是在程序设计中常见的数据类型,从数据结构的角度来讲,栈和队列也是线性表,是操作受限的线性表,它们的基本操作是线性表操作的子集,但从数据类型的角度来讲,它们与线性表又有着巨大的不同。本节将介绍队列的定义及其不同实现,并且给出队列的一些实际应用。

盼小辉丶的博客 3万+

Python实现的数据结构与算法之队列详解

本文实例讲述了Python实现的数据结构与算法之队列。分享给大家供大家参考。具体分析如下: 一、概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操作在队首(front)进行。 二、ADT 队列ADT(抽象数据类型)一般提供以下接口: ① Queue() 创建队列 ② enqueue(item) 向队尾插入项 ③ dequeue() 返回队首的项,并从队列中删除该项 ④ empty() 判断队列是否为空 ⑤ size() 返回队列中项的个数 队列操作的示意图如下: 三、Python实现 使用Python的内建类型list列表,可以很方便地实

常用数据结构和算法(python实现版)

【代码】常用数据结构和算法(python实现版)

weixin_41783242的博客 1665

别再为Word转PDF表格变形发愁了!Aspose.Words for Java 19.5 保姆级避坑指南

本文详细介绍了使用Aspose.Words for Java 19.5解决Word转PDF时表格变形问题的完整方案。从格式转换原理到实战技巧,涵盖固定表格宽度、禁用自动调整、强制文本换行等核心方法,并提供高级场景应对策略和性能优化建议,帮助开发者高效处理复杂文档转换需求。

weixin_28702105的博客 267

Python数据结构与算法

https://zhuanlan.zhihu.com/p/478635700

qq_35224503的博客 5618

Burp Suite手工验证CORS漏洞的四步闭环法

CORS(跨域资源共享)是Web应用实现跨域通信的基础机制,其安全本质在于服务端对Origin头的校验逻辑与响应头组合的语义一致性。当服务端错误地返回Access-Control-Allow-Origin: *并配合Access-Control-Allow-Credentials: true,或采用弱校验(如字符串包含匹配)时,将导致敏感数据泄露与凭据劫持风险。该漏洞难以被自动化扫描器发现,因其依赖请求上下文、认证状态及动态策略判断。Burp Suite作为核心工具,需通过构造跨域请求、捕获预检响应、交叉验

weixin_30596343的博客 513

ARM功耗管理之功耗状态及功耗模式

思考:功耗状态?功耗模式?Core&Cluster&Device&SoC如何映射?

AI-安全-功耗 785

python数据结构与算法总结

python常用的数据结构与算法就分享到此处,本月涉及数据结构与算法的内容有如下文章: 《数据结构和算法对python意味着什么?》 《顺序表数据结构在python中的应用》 《python实现单向链表数据结构及其基本方法》 《python实现单向循环链表数据结构及其方法》 《python实现双向链表基本结构及其基本方法》 《python实现双向循环链表基本结构及其基本方法》 《py...

python之战 2万+

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 685

数据结构与算法(python版)

时间复杂度 T(n)时间复杂度,n执行的步数 大O表示法,只记录最显著特征O(n)=nxn

Mr_DaYang的博客 3万+

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

本文给大家带来的改进机制是,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。这些模型基于简化的架构,并利用深度可分离卷积构建轻量级深度神经网络,其引入了两个简单的全局超参数,用于在延迟和准确性之间进行有效的权衡。实验表明,MobileNets在资源和准确性的权衡方面表现出色,并在多种应用(如对象检测、细粒度分类、面部属性识别和大规模地理定位)中展现了其有效性,这个模型非常适合轻量化的读者来使用。适用检测目标:轻量化网络结构适合轻量化的读者⭐⭐⭐⭐。

Snu77的博客 5686

IEC 104电力规约详细解读(五) - 遥控

主站下发遥控选择命令,子站进行遥控选择返校,若成功则回答遥控选择成功报文,若失败则回答失败报文。主站下发取消遥控命令或者遥控执行命令行。子站皆以报文的镜像确认。遥控命令用来实现对一个可操作设备状态的改变。在配电自动化中,包括单点命令和双点命令。通常,单点命令用于控制单点信息对象;双点命令用于控制双点信息对象。

张二狗的博客 7353

队列 数据结构与算法 python版

队列是一种有次序的数据集合,其特征是:新数据项的添加总发生在一端(通常称为“尾 rear”端)而现存数据项的移除总发生在另一端(通常称为 “首front”端)当数据项加入队列,首先出现在队尾,随 着队首数据项的移除,它逐渐接近队首。这种次序安排的原则称为(FIFO:First-in first-out)先进先出 或“先到先服务first-come first-served”

jaycyj的博客 1903

MATLAB 图像滤波:高通、低通、带通和方向滤波器

在 MATLAB 中,我们可以使用不同类型的滤波器对图像进行处理,包括高通滤波器、低通滤波器、带通滤波器和方向滤波器。通过以上代码示例,我们介绍了 MATLAB 中使用高通滤波器、低通滤波器、带通滤波器和方向滤波器对图像进行滤波的方法。高斯滤波器可以实现带通滤波效果,通过调整滤波器的方差参数可以控制带通滤波器的频率范围。这里的平均滤波器是一种常见的低通滤波器,通过对图像周围的像素进行平均来实现平滑效果。Sobel 滤波器是一种常用的方向滤波器,用于检测图像中的水平和垂直边缘。函数将高通滤波器应用于图像。

CyberSparkZ的博客 1396

数据结构与算法Python版 队列

您正在阅读的是《数据结构与算法Python版》专栏!队列Queue是一种有次序的数据集合。队列的例子:排队,打印队列,进程调度,键盘缓冲。Python实现抽象数据类型Queue。当多人共享一台打印机时,采取队列策略来模拟执行打印任务。

分享、交流、合作 1345

[特殊字符] 从零构建携程/飞猪机票价格爬虫:Python异步抓取与反爬对抗实战

在出行决策、竞品分析、价格预测模型训练等场景中,稳定获取携程(Ctrip)和飞猪(Fliggy)的实时机票价格波动数据是刚需。然而,这两大平台均部署了业界顶尖的反爬体系——包括但不限于:动态请求签名(SignToken设备指纹采集(UACanvasWebGL接口参数加密(X-Sign_abtestcookie混淆)频率限制与 IP 封禁(滑动窗口 + 行为检测)目录前言:为什么需要自建机票价格爬虫?一、技术选型与项目架构1.1 核心技术栈1.2 系统架构图(文字描述)1.3 法律与道德声明。

2201_76125261的博客 341

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Python数据结构与算法——数据结构(栈、队列)

使用python实现数据结构:栈、队列,以及几个经典问题:括号匹配问题、迷宫问题 还介绍python队列内置模块

qq_63043783的博客 1796

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python数据结构之栈和队列的实现(详细无敌版!!!!)

Python数据结构容器数据结构的理解栈和栈的实现定义实现栈的简单应用队列和队列的实现定义队列的实现双端队列及其实现阻塞队列 容器数据结构的理解 在常用的数据结构中,有一批结构被称为容器,一个容器结构里总包含一组其它类型的数据对象,称为其元素,支持对这些元素的存储、管理和使用。一类容器具有相同性质,支持同一组操作,可以被定义为一个抽象的数据类型 最常用的数据容器即为:栈(stack)和队列(queue) 栈和栈的实现 定义        

但行好事,莫问前程 7745

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【数据结构与算法】刷题汇总 Python 版

我的BLOG里写了一部分算法和数据结构,题目都是从网上和书上找的。当然一下这些并不全面,我打算利用今后的时间把各类的算法题都用Python写一遍(因为我主要是用Python),尽可能囊括所有的算法题。写这些题并不是目的,主要还是为了能够提升自己的数据结构和算法的水平,以及码代码的速度和熟练度。所有的代码都提交到了我的 github 上面:冬日新雨的github:数据结构和算法刷题代码下载1、字符串:

dongrixinyu的专栏 2万+

数据结构与算法之Python实现——队列

用Python实现循环队列、链式队列,通俗易懂

weixin_62917800的博客 3142

python数据结构及算法

python数据结构及算法 一. 数据结构与算法 1. 算法的概念:算法是独立存在的一种解决问题的方法和思想 2. 算法的特征:输入,输出,有穷性,确定性,可行性 3. 时间复杂度是实现算法程序所需要的时间,即算法的优劣 4. 数据结构是指数据对象中数据元素之间的关系 5. 程序 = 数据结构 + 算法 6. 算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体 二. 顺序表 1. 顺...

weixin_45841852的博客 2840

Python 数据结构与算法 学习

官方定义:并没有…民间定义:“数据结构是数据对象,以及存在于该对象的实例和组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”---《数据结构、算法与应用》“数据结构(datastructure)是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法。”---中文维基百科“数据结构是ADT(抽象数据类型AbstractDataType)的物理实现。”---《数据结构与算法分析》什么是抽象数据类型ADT?

m0_62791338的博客 1081
上一篇: 数据结构与算法——栈(python详细版附带例子)
下一篇: python的一些快速方法,遇到就更新
xiao黄
xiao黄 优质创作者: 人工智能技术领域 优质创作者: 人工智能技术领域 领域专家: 数据科学与机器学习技术领域 领域专家: 数据科学与机器学习技术领域
博客等级 码龄8年 1万+粉丝 250原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiao黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值