python循环队列

news2024/10/6 6:49:05

导语:

队列是一种先进先出(first in first out,FIFO)的线性表,是一种常用的数据结构。

它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。

图1 队列

队列有很多种,按照存储结构划分,有链式队列,循环队列,单向队列,双端队列。实现队列的方式也有很多种,如基于链式存储结构的链接队列(又称链队列),基于顺序存储结构的队列。

本文介绍基于数组(一种顺序存储结构)的循环队列的实现和一些基本操作,并用代码的形式讲解。

一些概念:

队列的顺序存储结构和顺序栈类似

在队列的顺序存储结构中,除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,还需要设置头尾两个指针front和rear,分别指示队列头元素及队尾元素的位置

我们规定

  • 初始化建立空队列时,令front=rear=0
  • 每当插入新的队尾元素时,“尾指针增1”
  • 每当删除队头元素时,“头指针增1”
  • 在非空队列中,头指针始终指向队列头元素,尾指针始终指向队列尾元素的下一个位置

 图2 队列的顺序存储结构

在入队和出队的操作中,头尾指针只增加不减小,致使被删除元素的空间永远无法重新利用,因此,尽管队列中实际的元素个数远远小于向量空间的规模,但也可能由于尾指针巳超出向量空间的上界而不能做入队操作,该现象称为假溢出

解决办法:将顺序队列臆造为一个环状的空间,称之为循环队列

循环队列:

图3 循环队列

循环队列的优势主要包括:

1. 有效利用存储空间:循环队列可以重复利用之前出队的空间,不会浪费存储空间。

2. 操作高效:循环队列的入队和出队操作的时间复杂度都是O(1),效率较高。

3. 实现简单:循环队列的实现相对简单,只需要一个数组和两个指针即可。

4. 适用于循环应用场景:循环队列适用于需要循环存储的场景,如循环缓冲区、循环任务调度等。

队空条件:rear = fornt
队满条件:(rear+1)%MaxSize == front(零位置没放元素)
元素进队:rear = (rear+1)%MaxSize
元素出队:front = (front+1)%MaxSize

代码:

# 队空条件:rear = fornt
# 队满条件:(rear+1)%MaxSize == front(零位置没放元素)
# 元素进队:rear = (rear+1)%MaxSize
# 元素出队:front = (front+1)%MaxSize
MaxSize = 5
class CircleQueue:  # 循环队列
    """若只剩下一个空位置,该循环列表锁定,不能再加,但其优势在于可边删边加(剩两个及以上空位时),避免了假溢出"""
    def __init__(self):
        self.data = [None] * MaxSize  # 初始空间
        self.front = 0
        self.rear = 0
    def push(self, e):  # 元素e进队
        assert (self.rear + 1) % MaxSize != self.front  # 判断队满
        self.rear = (self.rear + 1) % MaxSize
        self.data[self.rear] = e
    def is_empty(self):  # 判断队空
        return self.rear == self.front
    def pop(self):  # 元素出队
        assert not self.is_empty()  # 先判断是否为空
        self.front = (self.front + 1) % MaxSize
        return self.data[self.front]
    def gethead(self):  # 获取头元素
        assert not self.is_empty()
        return self.data[(self.front + 1) % MaxSize]
    def getsize(self):  # 获取队列长度,在front下标小于rear时,size可以直接用rear-front获取,但是如果边删边加,导致rear小于front,此方法出错
        return (self.rear - self.front + MaxSize) % MaxSize #该式满足上叙所有情况
    def dispaly(self):
        q=self.front
        if self.front !=self.rear: #判断队空
            for i in range(self.getsize()):
                q = (q+1)%MaxSize #符合两种情况的式子
                print(self.data[q], end=",")
        else:c
            return None

    def pushk(qu, k, e):
        n = qu.getsize()
        if k < 1 or k > n + 1:  #k必须正常
            return False
        if k <= n:
            for i in range(1, n + 1):  #边删边进
                if i == k:  #插个队,它插完,后面的再边删边进
                    qu.push(e)
                x = qu.pop()
                qu.push(x)
        e1se: qu.push(e)
        return True
    def popk(qu, k):
        n = qu.getsize()
        assert 1 <= k <= n
        for i in range(1, n + 1):  #和上面的思想一样
            x = qu.pop()
            if i != k:
                qu.push(x)
            else:
                e = x  # 取第k个出队的元素
        return e

if __name__=="__main__":
    hh = CircleQueue()
    print(hh.is_empty())
    hh.push(0)
    hh.push(1)
    hh.push(2)
    hh.push(3)
    print(hh.getsize())
    hh.dispaly()
# True
# 4
# 0, 1, 2, 3,
# Process
# finished
# with exit code 0

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

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

相关文章

盘点银行账单,订阅刺客让我们发出尖锐爆鸣

点击文末“阅读原文”即可参与节目互动 剪辑、音频 / 卷圈 运营 / SandLiu 卷圈 监制 / 姝琦 封面 / 姝琦Midjourney 产品统筹 / bobo 随着年底大家纷纷开始盘点自己的年度开销&#xff0c;我们的主播们决定为大家揭示一个常被忽视的话题 – “订阅刺客”。在这个数字化时…

C++二分算法:水位上升的泳池中游泳

涉及知识点 二分查找 并集查找或BFS。 题目 在一个 n x n 的整数矩阵 grid 中&#xff0c;每一个方格的值 grid[i][j] 表示位置 (i, j) 的平台高度。 当开始下雨时&#xff0c;在时间为 t 时&#xff0c;水池中的水位为 t 。你可以从一个平台游向四周相邻的任意一个平台&…

git上传项目至github(Linux)

01 git版本创建 git init 创建版本库 创建一个版本 git add test1.cpp git commit -m 说明信息 git log 查看版本记录 02 版本回退 git reset --hard HEAD^ 版本回退一个 git reset --hard HEAD^^ 版本回退二个 git reset --hard 版本号 版本回退到指定版本&#xff0…

Springboot集成redis和mybatis-plus及websocket异常框架代码封装

在软件开发过程中&#xff0c;一款封装完善简洁大气的全家桶框架&#xff0c;能大大提升开发人员的工作效率&#xff0c;同时还能降低代码的复杂程序&#xff0c;也便于后期方便维护。本文所涉及源代码在文章最后&#xff0c;有下载链接。 本文章所涉及封装的框架&#xff0c;…

Redis系列-Redis过期策略以及内存淘汰机制【6】

目录 Redis系列-Redis过期策略以及内存淘汰机制【6】redis过期策略内存淘汰机制算法LRU算法LFU 其他场景对过期key的处理FAQ为什么不用定时删除策略? Ref 个人主页: 【⭐️个人主页】 需要您的【&#x1f496; 点赞关注】支持 &#x1f4af; Redis系列-Redis过期策略以及内存淘…

js:React中使用classnames实现按照条件将类名连接起来

参考文档 https://www.npmjs.com/package/classnameshttps://github.com/JedWatson/classnames 安装 npm install classnames示例 import classNames from "classnames";// 字符串合并 console.log(classNames("foo", "bar")); // foo bar//…

学之思开源考试系统部署至Centos7

学之思开源考试系统部署至Centos7 1、下载源码 源码下载&#xff1a; https://gitee.com/mindskip/xzs-mysql 数据库脚本下载&#xff1a; https://www.mindskip.net:999/ 2、项目打包 分别在\source\vue\xzs-student目录和source\vue\xzs-admin目录&#xff0c;执行前端打…

Improved Population Control for More Efficient Multimodal Optimizers

多模态优化 NC-VMO means ‘Niche-Clearing-based VMO’&#xff0c;ASD means ‘Adaptive Species Discovery’&#xff0c;HVcMO means ‘Clustering-based Variable Mesh Optimization’ N c A _c^A cA​是A的推荐种群规模&#xff0c;inc means ‘increment’&#xff0c;…

中国芯片产能加速增长,美芯销量下滑,难怪美芯和ASML都低头了

日前分析机构给出的数据指中国的芯片产量呈现加速增长的趋势&#xff0c;伴随的就是芯片进口在下滑&#xff0c;国产芯片的加速替代&#xff0c;已给美国芯片等海外芯片行业造成巨大的打击。 分析机构给出的数据指今年3-6月中国的芯片产能都在稳步增长&#xff0c;不过增长为个…

如何检测小红书账号是否被限流?哪些原因会导致账号被限流?

hi&#xff0c;同学们&#xff0c;本期是第5期AI运营技巧篇&#xff0c;文章底部准备了粉丝福利&#xff0c;看完后可领取&#xff01; 最近好多新手学员运营小红书账号&#xff0c;可能会遇到这样的问题&#xff1a;发布的内容小眼睛少得可怜&#xff1f;搜索不到自己的笔记&…

Qt开发环境搭建

Index of /official_releases/online_installers (qt.io)

Xmake v2.8.5 发布,支持链接排序和单元测试

Xmake 是一个基于 Lua 的轻量级跨平台构建工具。 它非常的轻量&#xff0c;没有任何依赖&#xff0c;因为它内置了 Lua 运行时。 它使用 xmake.lua 维护项目构建&#xff0c;相比 makefile/CMakeLists.txt&#xff0c;配置语法更加简洁直观&#xff0c;对新手非常友好&#x…

(六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题

前言 本节内容是关于使用分布式锁解决并发访问“超卖”问题的最终篇&#xff0c;在前面的章节中我们介绍了使用mysql的行锁、乐观锁、悲观锁解决并发访问导致的超卖问题&#xff0c;存在的问题是行锁、乐观锁、悲观锁不太灵活&#xff0c;需要和具体的业务耦合到一起&#xff…

盘点几种常用加密算法

文章目录 前言常用算法DES算法DES算法特点DES算法示例 AES算法AES算法特点AES算法示例 RSA算法RSA算法特点RSA算法示例 MD5算法MD5算法特点MD5算法示例 SHA算法SHA算法特点SHA算法示例 总结写在最后 前言 随着互联网的发展,信息安全问题日益受到重视。加密算法在保证信息安全传…

力扣算法-----一刷总结

之前学习算法题坚持不了几天就很容易放弃&#xff0c;一直没怎么系统的练习&#xff0c;偶然发现代码随想录居然推出了算法训练营&#xff0c;趁着时间比较足报了名跟着学习了两个月。 过去的两个月&#xff0c;中间伴着各种琐事&#xff0c;但还是坚持了下来&#xff0c;走过…

网络安全之CSRF漏洞原理和实战,以及CSRF漏洞防护方法

一、引言 总体来说CSRF属于一种欺骗行为&#xff0c;是一种针对网站的恶意利用&#xff0c;尽管听起来像跨站脚本&#xff08;XSS&#xff09;&#xff0c;但是与XSS非常不同&#xff0c;并且攻击方式几乎向佐。XSS利用站点内的信任用户&#xff0c;而CSRF则通过伪装来自受信任…

如何使用ArcGIS Pro制作个性三维地形图

制作三维地图制作的多了&#xff0c;想着能不能换个“口味”&#xff0c;恰好看见制作六边形蜂窝图&#xff0c;灵光一闪&#xff0c;想着将二者结合&#xff0c;将平滑的三维地形图改成柱状图&#xff0c;从结果来看还可以&#xff0c;这里将制作方法分享给大家&#xff0c;希…

基于51单片机太阳能热水器控制系统-proteus仿真-程序

、系统方案 系统设计将软件设计内容分为了六大模块&#xff0c;分别是蜂鸣器报警、水位检测、DS18B20模块、液晶显示、加热模块、按键模块&#xff0c;系统将其进行分别设计&#xff0c;接通电源之后&#xff0c;单片机分别向LCD1602液晶显示器、DS18B20模块、和按键发出初始化…

C【整数正序分解】

// 整数正序分解 #include <stdio.h> #include <stdlib.h>int main() {int x;scanf("%d", &x);// 13425/10000->1(int一个d)// 13425%10000->3425(这是x)// 10000/10-.1000(这是mask)int mask 1;int t x;while (t > 9){t / 10;mask * 10;…

安装dubbo-admin报错node版本和test错误

✅作者简介&#xff1a;CSDN内容合伙人、信息安全专业在校大学生&#x1f3c6; &#x1f525;系列专栏 &#xff1a;dubbo-admin安装 &#x1f4c3;新人博主 &#xff1a;欢迎点赞收藏关注&#xff0c;会回访&#xff01; &#x1f4ac;舞台再大&#xff0c;你不上台&#xff0…