python循环队列

导语:

队列是一种先进先出(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

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

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

相关文章

C语言——计算1!+2!+3!+......+10!

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int n;int ret 1;int sum 0;for(n 1; n < 10; n){ret * n;sum sum ret;}printf("sum %d\n",sum);return 0; }

C++基础——类与对象

1 概述 C是面向对象的语言&#xff0c;面向对象语言三大特性&#xff1a;封装、继承、多态。 C将万事万物抽象为对象&#xff0c;对象上有其属性和行为。 2 封装 2.1 封装的意义 封装是面向对象的三大特性之一&#xff0c;封装将属性和行为作为一个整体&#xff0c;对属性和…

接口自动化面试题

1.http请求都包含哪些内容&#xff0c;请求头和请求体有哪些内容 请求行/请求头/请求体/空行 请求行&#xff1a;请求方法字段、URL字段、http协议版本 例如&#xff1a;GET /index.html HTTP/1.1 请求方法&#xff1a;GET、POST、PUT、DELETE、OPTIONS、TRACE、CO…

2007-2022年全国各地级市金融机构网点数据

2007-2022年地级市金融机构网点数据 1、时间&#xff1a;2007-2022年 2、指标&#xff1a;行政区划代码、年份、城市名称、所属省份、银行网点数量、其中-政策性银行及国家开发银行营业网点占比、其中-商业银行营业网点数量占比、其中-农村金融机构营业网点数量占比 3、范围…

20.8 OpenSSL 套接字SSL传输文件

有了上面的基础那么传输文件的实现就变得简单了&#xff0c;在传输时通常我们需要打开文件&#xff0c;并每次读入1024个字节的数据包&#xff0c;通过SSL加密传输即可&#xff0c;此处的文件传输功能在原生套接字章节中也进行过详细讲解&#xff0c;此处我们还是使用原来的密钥…

Excel 转 Json 、Node.js实现(应用场景:i18n国际化)

创作灵感来源于在线转换是按照换行符去转换excel内容换行符后很难处理 本文是按单元格转换 const xlsx require(node-xlsx) const fs require(fs) const xlsxData xlsx.parse(./demo.xlsx) // 需要转换的excel文件// 数据处理 方便粘贴复制 const data xlsxData[2].data …

Hello Vue!

目录 前言 hello vue 为什么要new Vue(),而不能直接调用Vue()? Vue构造函数中的形参options template配置项 $mount()方法 前言 从此篇博客开始&#xff0c;将开启vue的学习&#xff0c;查缺补漏。 只要学计算机语言&#xff0c;那么hello xxx那一定是入门第一行代码了…

CSS 链接、列表、表格、盒子模型

一、CSS链接: 不同的链接可以由不同的样式。链接的样式可以用任何CSS属性&#xff08;比如颜色、字体、背景等&#xff09;。 链接的四种状态&#xff1a; a.link&#xff1a;正常&#xff0c;未访问过的链接&#xff1b; a.visited&#xff1a;用户已访问过的链接&#xf…

什么是CE认证?蓝牙耳机出口欧盟CE认证如何办理?CE-RED认证办理

蓝牙耳机是一种基于蓝牙技术的一种小型设备&#xff0c;只需要把这种轻巧的设备藏在耳机边而不需要直接使用通讯设备&#xff08;手机、电脑等&#xff09;就可以实现自由通话。蓝牙耳机就是将蓝牙技术应用在免持耳机上&#xff0c;让使用者可以免除恼人电线的牵绊&#xff0c;…

C++:类和对象(下)

1.再谈构造函数&#xff1a; 构造函数体赋值&#xff1a; 回顾&#xff1a;在创建对象时&#xff0c;编译器通过调用构造函数&#xff0c;给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day d…

如何避免JavaScript中的内存泄漏?

前言 过去&#xff0c;我们浏览静态网站时无须过多关注内存管理&#xff0c;因为加载新页面时&#xff0c;之前的页面信息会从内存中删除。 然而&#xff0c;随着单页Web应用&#xff08;SPA&#xff09;的兴起&#xff0c;应用程序消耗的内存越来越多&#xff0c;这不仅会降低…

iOS加固原理与常见措施:保护移动应用程序安全的利器

目录 iOS加固原理与常见措施&#xff1a;保护移动应用程序安全的利器 前言 一、iOS加固的原理 1. 代码混淆 2. 加密算法 3. 防调试技术 4. 签名校验 二、iOS加固的常见措施 1. 代码混淆 2. 加密算法 3. 防调试技术 4. 签名校验 三、iOS加固的效果和注意事项 参考…

网络原理---拿捏传输层:TCP/UDP协议

文章目录 UDP协议源端口、目的端口UDP长度校验和 TCP协议源端口、目的端口4位首部长度、选项保留位&#xff1a;6位6个特殊标志位32位序号、32位确认序号&#xff1a;在确认应答机制中使用16位窗口大小&#xff1a;在流量控制机制中使用16位校验和 TCP协议 VS UDP协议 在本篇中…

Web时代下,软件系统的持续进步,是否能完全替代人力节省成本?

Web时代下&#xff0c;软件系统的持续进步&#xff0c;是否能完全替代人力节省成本&#xff1f; 随着全球经济的蓬勃发展&#xff0c;众多经济学家纷纷提出了新的管理理念&#xff0c;例如在20世纪50年代&#xff0c;西蒙提出管理依赖信息和决策的思想&#xff0c;但在同时期的…

20231107-前端学习炫酷菜单效果和折叠侧边栏

炫酷菜单效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>炫酷菜单效果</title><…

消息中间件简介

一、 分布式系统消息通信技术简介 分布式系统消息通信技术主要包括以下几种&#xff1a; 1. RPC(Remote Procedure Call Protocol). 一般是C/S方式&#xff0c;同步的&#xff0c;跨语言跨平台&#xff0c;面向过程 2. CORBA(Common Object Request Broker Architecture). CO…

搜索引擎Elasticsearch基础与实践

倒排索引 将文档中的内容分词&#xff0c;然后形成词条。记录每条词条与数据的唯一表示如id的对应关系&#xff0c;形成的产物就是倒排索引&#xff0c;如下图&#xff1a; ElasticSearch数据的存储和搜索原理 这里的索引库相当于mysql中的database。一个文档&#xff08;do…

【基带开发】AD9361通信基础:复数乘法 除法

复数 是实数和虚数的组合 例子&#xff1a;3.6 4i, −0.02 1.2i, 25 − 0.3i, 0 2i 乘法 除法

在maven官网中如何下载低版本的maven

链接&#xff1a;https://archive.apache.org/dist/maven/maven-3/

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…