基于Python3的数据结构与算法 - 14 队列

news2024/12/27 10:39:08

目录

一、定义

1. 环形队列

2. 自定义队列

二、队列的内置模块 

1. 双向队列


一、定义

  1. 队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。
  2. 进行插入的一端称为队尾(rear),插入动作称为进队或入队
  3. 进行删除的一端称为队头(front),删除动作称为出队
  4. 队列的性质:先进先出(First-in, First-out)。

队列也可以使用列表来实现:

但是这种情况下会出现一个问题:若我们采用pop(下标来进行出队),此时操作上时间复杂度为为O(n),而且在情况(d)下,此时如果我们还需要入栈,只能在后面的空间上,前面的空间会造成浪费,因此我们引入环形队列。 可以到最后从头到尾接起来。

1. 环形队列

定义:当队尾指针front == Maxsize - 1时, 再前进一个位置就自动到0. 

  • 队首指针前进1:front = (front + 1)% MaxSize
  • 队尾指针前进1:rear = (rear + 1)% MaxSize
  • 队空条件:rear == front
  • 队满条件:(rear + 1) % MaxSize == front

对满的情况少1格是为了防止与空队列的情况相同。

2. 自定义队列

我们可以通过自己创建一个类来实现队列的功能,示例代码如下:

class Queue:
    def __init__(self, size = 100):   # 创建一个大小为100的列表
        self.queue = [0 for _ in range(size)]
        self.size = size
        self.rear = 0   # 队尾 = 0
        self.front = 0   #队首 = 0
          
    def push(self,element):   # 进队
        if not self.is_filled():   #判断队满
            self.rear = (self.rear +1) % self.size
            self.queue[self.rear] = element
        else:
            raise IndexError("Queue is filled")
        
    def pop(self):  #出队
        if not self.is_empty():  # 判断队空
            self.front = (self.front +1) % self.size
            return self.queue[self.front]  # 返回最后一位的元素
        else:
            raise IndexError("Queue is empty")
    
    def is_empty(self):   #判断队空
        return self.rear == self.front
    
    def is_filled(self):  # 判断队满
        return (self.rear + 1) % self.size == self.front

二、队列的内置模块 

1. 双向队列

双向队列的两端都支持进队和出队的操作。

双向队列的基本操作:

  • 队首进队
  • 对手出队
  • 队尾进队
  • 队尾出队

这个队列与多线程中的队列不一样。是一种特殊的数据结构。

  • 使用方法:
from collections import deque
  • 创建队列: queue = deque()
  • 进队:append()
  • 出队:popleft()
  • 双向队列队首进队:appendlleft()
  • 双向队列队尾出队:pop() 

实例:

如果我们需要打印一个文件的后几行,可以使用队列

from collections import deque

# q = deque([1, 2, 3, 4, 5],5)
def tail(n):  # n表示打印几行
    with open('test.txt', 'r') as f:
        q = deque(f, n)  # f表示读取的内容,n表示最大队列的范围  # 每次读取一个f
        return q  


# deque的特性:当队满时,此时再进队会自动使得第一位的元素出队
for line in tail(5):
    print(line, end='')

实现思路:我们设置n = 5,那么当我们把整个数据传入列表中时。队列满出来,使得前面的数据自动出队,最后只剩下最后的5行元素。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1509672.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python请求url下载网站中的视频

举例网站:Mini Impresora Trmica Bluetooth Porttil Inalmbrico | Envo gratis ctrlF4 先搜mp4 搜不到就搜m3u8 了 视频格式如下 ( AVI(Audio Video Interleave):是一种由微软公司开发的音频和视频文件格式。MOV&…

02_electron快速建立项目

一、安装 yarn 在此之前可以先安装 git:Git - Downloads (git-scm.com) 下面就是 yarn 安装的代码,在终端输入即可。 npm install --global yarn 检查是否安装成功: yarn --version 二、快速建立一个electron项目 其实在Getting Started - …

【HarmonyOS】鸿蒙开发之工具安装与工程项目简介——第1章

鸿蒙开发工具包下载与使用 鸿蒙开发工具包下载 下载deveco studio开发工具包 系统要求: Windows 操作系统:Windows 10/11 64 位 内存:8GB 及以上 硬盘:100GB 及以上 分辨率:1280*800 像素及以上macOS 操作系统:mac…

【rk3229 android7.1.2 替换默认输入法】

问题平台描述 问题描述解决方法 郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3229 OS:Android 7.1.2 Kernel: 3.10 问题描述 国内客户,觉得安卓自带的输入法不好用&#x…

LeetCode刷题---每月交易I

LeetCode官方题解 解题思想: 首先按照日期和国家/地区进行分组 对分组后的结果求解,使用IF函数进行过滤 涉及函数 1.在对日期截取时,使用了MySQL中的DATE_FORMAT函数,将日期转换为指定格式的日期 //2024-03-11,截取为 2024-03-…

【数据可视化】数据可视化入门前的了解

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 数据可视化概述2.1 数据可视化的定义及特性2.1.1 数据可视化的定义2.1.2 特性 2.2 数据中蕴含的信息2.3 数据可视化的作用2.3.1 模式2.3.2 关系2.3.3 异常 3. 数据可视化流程4. 数据可视化工具4.1 ECharts4…

如何在Linux部署FastDFS文件服务并实现无公网IP远程访问内网文件——“cpolar内网穿透”

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

记录一下某外资的面试

文章目录 标题English introduction标题What did u do in this gap time标题What’S the big challenge in your work experience标题 4、介绍一个自己熟悉的项目或最近的项目,包括项目的背景,使用的技术,在里面的角色标题5、项目中有多少个微…

力扣--深度优先算法/回溯算法78.子集

思路分析: 首先,定义了一个类 Solution,其中包含一个成员变量 result 用于存储最终的所有子集。在类中定义了一个私有成员函数 dfs,用于执行深度优先搜索,生成所有可能的子集。主函数 subsets 初始化结果,…

Vue2(4)——iHRM组织架构

组织架构-树组件应用 树形组件-用层级结构展示信息,可展开或折叠。 属性设置 data(绑定数据)props(设置属性)- children(设置子节点的字段名)/ label(设置显示内容的字段名)default-expand-all(默认展开所有节点) 组织架构-树组件自定义结构 显示右侧结构 节点结…

个人商城系统开源(配置支付宝支付!)

原文地址:个人商城系统开源(配置支付宝支付!) - Pleasure的博客 下面是正文内容: 前言 由于近期实在没有什么话题可写和一些有趣的项目教程可以分享。所以我只能决定将我自己亲手编写的一个迷你迷你商城系统进行开源…

npm install报错,error <https://npm.community>解决方法

报错信息如下: 分析原因: 1.可能是由于node版本过低,或者过高,解决方法看我另一文章:npm install报错,npm版本过高,需要切换低版本node,过程记录 2.网络问题导致 3.切换node版本后&#xff0…

Material UI 5 学习03-Text Field文本输入框

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

Linux第76步_“gpio子系统”下的LED驱动

使用新字符设备驱动的一般模板和“gpio子系统”,以及设备树,驱动LED。 1、添加“gpio_led”节点 打开虚拟机上“VSCode”,点击“文件”,点击“打开文件夹”,点击“zgq”,点击“linux”,点击“…

LLM - 大语言模型的自注意力(Self-Attention)机制基础 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136623432 注意力(Attention)机制是大型语言模型中的一个重要组成部分,帮助模型决定在处理信息时,所应该关注的部…

后端八股笔记------微服务篇

注册中心的主要作用:根据服务进行负载均衡,服务的健康监控。 服务雪崩,因为一个服务D的宕机,导致很多服务崩掉。 达到失败阈值----Closed_to_Open 服务降级------某一个接口 服务熔断------整个服务 限流常见的算法可以是令牌…

代理IP如何应对自动化测试和爬虫检测

目录 一、代理IP在自动化测试和爬虫中的作用 二、代理IP的优缺点分析 1.优点 2.缺点 三、应对自动化测试和爬虫检测的策略 1.选择合适的代理IP 2.设置合理的请求频率和间隔 3.模拟人类行为模式 4.结合其他技术手段 四、案例与代码示例 五、总结 在自动化测试和爬虫开…

Docker笔记-进入运行中的镜像,查看日志等操作

docker搭建好后&#xff0c;查看运行的docker镜像&#xff1a; docker ps -a 进入运行的容器&#xff0c;命令如下&#xff1a; docker exec -it <容器ID> /bin/bash # 或者&#xff0c;直接用容器里面的命令&#xff0c;比如mysql镜像 docker exec -it <容器ID>…

RuoYi-Vue前后端部署

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

MacOS - 在 Mac 上自定义“访达”边栏(快捷方式)

将文件添加到边栏&#xff1a;按住 Command 键&#xff0c;然后将文件拖到“个人收藏”部分。如果没有看到“个人收藏”部分&#xff0c;请选取“访达” > “设置” > “边栏”&#xff0c;然后在“个人收藏”部分中选择至少一个项目。 将文件添加到“访达”边栏仅会创建…