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

目录

一、定义

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行元素。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端基础篇-深入了解用 HTML 与 CSS 实现标题排版

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 HTML 与 CSS 概述 2.0 HTML - 标题排版 2.1 图片标签 2.2 标题标签 2.3 水平标签 2.4 实现标题排版 3.0 HTML - 标题样式(style 样式) 3.1 CSS 的引入方式 3.2…

2024最新版使用PyCharm搭建Anaconda

2024最新版使用PyCharm搭建Anaconda 因为pycharm自带的包不全,或者下载的时候比较慢,所以我们直接用anaconda的包,毕竟我们以后还会学到很多的包,不多说,直接开干! 一、下载Pycharm、Anacoda pycharm中文网…

02_electron快速建立项目

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

用chatgpt写论文重复率高吗?如何降低重复率?

ChatGPT写的论文重复率很低 ChatGPT写作是基于已有的语料库和文献进行训练的,因此在写作过程中会不可避免地引用或借鉴已有的研究成果和观点。同时,由于ChatGPT的表述方式和写作风格与人类存在一定的差异,也可能会导致论文与其他文章相似度高…

06多表查询

多表查询 多表查询,也称为关联查询,指两个或更多个表一起完成查询操作。前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个 关联字段可能建立了外键&am…

网络基础『 序列化与反序列化』

🔭个人主页: 北 海 🛜所属专栏: Linux学习之旅、神奇的网络世界 💻操作环境: CentOS 7.6 阿里云远程服务器 文章目录 🌤️前言🌦️正文1.协议的重要性2.什么是序列化与反序列化&…

安装配置Kafka

一个典型的Kafka集群中包含若干Producer(可以是Web前端FET,或者是服务器日志等),若干Broker(Kafka支持水平扩展,一般Broker数量越多,集群吞吐率越高),若干ConsumerGroup&…

wordpress免费主题下载

免费wordpress模板下载 简洁大气的文化艺术类wordpress模板,可以免费下载,实用易上手,新手也适合。 https://www.wpniu.com/themes/304.html 免费wordpress主题下载 高端大气上档次的wordpress主题,也可以是免费的,…

【机器学习】无监督学习算法之:层次聚类

层次聚类 1、引言2、层次聚类2.1 定义2.2 原理2.3 实现方式2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝:鱼哥, 这周末过的滋润啊。 小鱼:… 每个周末都挺滋润的啊。 小屌丝:啊~ ~ 你这… 小鱼:周末加班&#xf…

Skywalking(9.7.0) 告警配置

图片被吞,来这里看吧:https://juejin.cn/post/7344567669893021736 过年前一天发版,大家高高兴兴准备回家过年去了。这时候老板说了一句,记得带上电脑,关注用户反馈。有紧急问题在高速上都得给我找个服务区改好。 但是…

矩阵乘法--Strassen算法

一、矩阵乘法 从中可以看出&#xff0c;计算两个矩阵的乘积&#xff0c;需要三个 for 循环&#xff0c;可以简单写出代码&#xff1a; for(int i1;i<m;i)for(int j1;j<p;j)for(int k1;k<n;k)c[i][j]a[i][k]*b[k][j]; 时间复杂度的分析&#xff1a;很明显&#xff0c;…

JDK环境变量配置-jre\bin、rt.jar、dt.jar、tools.jar

我们主要看下rt.jar、dt.jar、tools.jar的作用&#xff0c;rt.jar在​%JAVA_HOME%\jre\lib&#xff0c;dt.jar和tools.jar在%JAVA_HOME%\lib下。 rt.jar&#xff1a;Java基础类库&#xff0c;也就是Java doc里面看到的所有的类的class文件。 tools.jar&#xff1a;是系统用来编…

网络通信(一)

网络编程概述 可以让设备中的程序与网络上其他设备中的程序进行数据交互&#xff08;实现网络通信的&#xff09;。 Java提供了哪些网络编程的解决方案 java.net.*包下提供了网络编程的解决方案 基本的通信架构 基本的通信架构有2种形式&#xff1a;CS架构&#xff08;Clie…

webgl instance 绘制

webgl instance 绘制 效果: key1: 创建实例缓存 function createMesh() {for (let i 0; i < NUM_CUBE; i) {const angle i * 2 * Math.PI / NUM_CUBE;const x Math.sin(angle) * RADIUS;const y 0;const z Math.cos(angle) * RADIUS;cubes[i] {scale: new THREE.V…

redis穿透、雪崩、击穿及其解决方案

redis穿透、雪崩、击穿及其解决方案 redis三个问题及解决方案缓存穿透缓存雪崩缓存击穿 redis三个问题及解决方案 缓存穿透 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在&#xff0c;这样缓存永远不会生效&#xff0c;这些请求都会打到数据库。也就是说key对应的…

黑马程序员-瑞吉外卖Day10

1.菜品分页查询 而在我们的实体类 Dish 中&#xff0c;仅仅包含 categoryId&#xff0c; 不包含 categoryName&#xff0c;那么我们应该如何封装查询的数据呢&#xff1f; 其实&#xff0c;这里我们可以返回DishDto对象&#xff0c;在该对象中我们可以拓展一个属性 categoryN…

高精度10m/30米NPP净初级生产力分布数据

引言 第一性生产力是绿色植物呼吸后所剩下的单位面积单位时间内所固定的能量或所生产的有机物质&#xff0c;即是总第一性生产量减去植物呼吸作用所剩下的能量或有机物质。多种卫星遥感数据反演净初级生产力&#xff08;NPP&#xff09;产品是地理遥感生态网平台推出的生态环境…

java-ssm-jsp的问卷调查系统的设计与实现

java-ssm-jsp的问卷调查系统的设计与实现

使用Python查询和下载Sentinel卫星数据

欢迎学习本教程,了解如何使用 Python 访问和下载 Sentinel 卫星数据。在深入探讨技术方面之前,让我们先了解一下哨兵卫星是什么以及它们为何如此重要。 哨兵家族。资料来源:欧空局。 Sentinel 卫星是欧洲航天局 (ESA) 开发的一组地球观测任务,是哥白尼计划的一部分,该计划…

论文阅读 Stepwise Feature Fusion: Local Guides Global

1&#xff0c;另一个ssfomer 我在找论文时发现&#xff0c;把自己的分割模型命名为ssformer的有两个&#xff1a;&#xff0c;一个论文SSformer: A Lightweight Transformer for Semantic Segmentation中提出的一种轻量级Transformer模型&#xff0c;结构如下 这个结构很简单&…