栈和队列---循环队列

1.循环队列的出现

(1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接在这个队尾插入数据就可以了,但是在队头把这个数据出队之后,我们想要保持这个队列的完整性,就需要使用循环把这个队列里面的数据向前进行移动,这个是增加了这个方法的时间复杂度;

(2)我们新的方法就是定义两个指针,一个指针就是rear指针,指向这个队列的尾部,一个指针就是front指针,指向这个队列的头部,我们在进行这个数据的入队的时候,我们先让这个rear+1,然后把这个入队的数据放到这个指针指向的位置;

(3)在队头出队的时候,我们只需要把这个front的指针先向后移动,再把这个指针指向位置的元素给删除掉,实际上这个指针向后移动之后,两个指针之间的位置才属于我们的这个队列的范围,我们这个数据也不能称之为删除,而是这个数据不在我们的这个队列里面了,相当于这个数据被“删除了”而已;

(4)但是这个还会出现一个问题,对于一个队列而言,我们在前面删除数据,前面就是空的了,这个时候我们的rear如果不短的入数据,这个指针最后就会指向这个队列的队尾,我们这个时候其实队列的前面还是空的,但是这个时候这块空间已经没有办法使用了,因此我们需要把这个问题解决掉,这个现象我们称为假溢出问题;

(5)解决这个假溢出问题的方法就是我们下面即将介绍的循环队列问题,循环队列就是使用的这个队列的尾指针指向这个队列的头指针,这个头尾项链之后就可以实现我们的这个尾部的数据空间全部占用之后,我们可以向这个队列的前面的部分空间去填充数据,这个就可以大大的提高这个空间的利用率,而且出队的数据越多,这个前面的空间就越大,这个空间的利用率就会越高;

2.循环队列的实现

(1)指针指向位置的说明

front指向的是这个队列的第一个数据前面的位置,而不是指向队列里面的第一个数据,rear指向的就是这个队列的最后一个数据;

(2)循环队列的实现,就是让这个最后一个下标加上1之后和这个队列里面的元素的个数取模,等于0,这个时候就相当于这个最后一个下标之后就是第一个下标,以此来实现这个循环队列;

(3)队列是空的临界条件:

我们假设这个时候的队列里面只有一个数据,指针的指向情况如图所示,front指向的就是这个队列里面的第一个数据的前一个位置,rear指向的就是这个队列的最后一个数据;

我们把这个数据出队之后,这个数据相当于就是被删除了,这个时候队列就是空的,删除数据之后我们的front指针需要向前移动一个位置,这个时候两个指针指向相同位置;

(4)队列数据是满的临界条件:

我们假设这个时候的队列里面只有一个位置是空余的,我们这个时候的指针的指向如图所示,rear指向这个队列数据的最后一个(这个时候已经是循环队列了,所以这个时候a6才是这个队列的最后一个数据),front指向这个队列的前面的一个位置;

我们把这个数据在入队一个之后,这个队列就是满的,但是添加数据之后,rear指针需要向后移动,这个时候两个指针再次指向了相同位置,只不过上一次是这个front向前移动,追上了rear指针,这一次是这个rear指针的移动和front指针指向了相同位置,因为这个数据的入队,我们需要移动这个rear指针,数据出队,我们需要移动这个front指针,两个最后的效果是一样的,但是中间经历的过程不是一样的;

(5)

(6)循环队列实现入队和出队

我们之前的这个思路完全不变,只不过这个循环之后,原来这个入队就是把这个rear直接向后移动一位即可,但是这个时候因为是循环队列,所以我们需要多考量一下,就是让这个rear+1能够被队列元素个数整除即可,这个时候就满足循环队列的要求;

同理这个队列里面数据的出队,原来就是这个front=front+1现在就是在这个front+1后面出以这个队列元素的个数进行取模即可;

(7)得到队列的第一个数据

我们让这个front+1位置元素赋值给这个数据,这个时候我们就可以得到我们想要的数据;

3.银行排队算法

(1)基本介绍

(2)需要的结构

第一个就是这个事件链表,表示这个银行业务的时间发生情况,交给这个计算机进行处理,还有一个就是需要这个队列数组,表示每一个窗口的这个排队的情况;

(3)具体举例说明

这个事件链表和这个队列数组之间有什么关系?我们通过两个例子说明一下:

首先看一下这个事件链表里面的16 2这个节点,这个2表示的就是右边的2号窗口,这个时候我们就去右边找到2号窗口,发现这个里面5 11两个数据,表示就是时间为5的时候,窗口2来了一个客户,经过11分钟的服务,这个客户完成离开,离开时间就是16,因此左边的这个链表里面节点写的数据是16;

再看一下这个左边链表的37 1,表示这个显示的是1号窗口的事件情况,这个时候我们发现这个时间为8时候,客户办理业务,经过29分钟之后,这个客户离开,因此这个离开时间就是8+29=37符合左边的链表节点显示的数据;

由此可见,链表和队列数组有着密切的联系,两者之间的数据是相互辅助的;

由于这个算法的综合性比较强,因此学有余力的同学可以自行学习,刚开始学习栈和队列的同学不建议上手,因为这个里面涉及到链表,和这个队列数组,综合性较强,需要把这些铺垫知识学好再去学习;

懒猫老师-数据结构-(12)队列应用:银行排队模拟(离散事件模拟)_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1nE411u7n4/?spm_id_from=333.788&vd_source=a432cb5e896a2b96961d1f73a6ebe0ca

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

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

相关文章

为什么固定尺寸 AdSense 广告依旧会出现并非指定的尺寸广告?

经常在网站上投放谷歌 AdSense广告的站长应该都碰到过,明明投放的是固定尺寸的广告位里旧会出现并非指定尺寸的AdSense 广告,很诡异的感觉。其实这都是因为你的 AdSense 账号广告优化造成的,其中里面就包含了广告尺寸优化,只需要在…

盘点当下智能体应用开发的几种形态

现在多智能体系统开发的关注度越来越高了,不光在开发者的圈子热度很高,很多职场人士,甚至是小白也参与其中,因为现在的门槛越来越低了,尤其是,最近特别火的扣子(coze)和百度的appbui…

Sequelize 操作 MySQL 数据库

安装 npm install --save sequelize安装驱动程序: npm install --save mysql2连接到数据库 要连接到数据库,必须创建一个 Sequelize 实例. 这可以通过将连接参数分别传递到 Sequelize 构造函数或通过传递一个连接 URI 来完成: const {Sequelize} re…

【Java12】封装

封装(Encapsulation)是面向对象的三大特征之一(另两个是继承和多态),指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象的内部信息,而是通过该类所提供的方法来实现对内部信息的…

[护网训练]原创应急响应靶机整理集合

前言 目前已经出了很多应急响应靶机了,有意愿的时间,或者正在准备国护的师傅,可以尝试着做一做已知的应急响应靶机。 关于后期: 后期的应急响应会偏向拓扑化,不再是单单一台机器,也会慢慢完善整体制度。…

《昇思25天学习打卡营第14天|onereal》

第14天学习内容如下: Diffusion扩散模型 本文基于Hugging Face:The Annotated Diffusion Model一文翻译迁移而来,同时参考了由浅入深了解Diffusion Model一文。 本教程在Jupyter Notebook上成功运行。如您下载本文档为Python文件&#xff0c…

Zabbix 配置grafana对接

zabbix对接grafana简介 Zabbix与Grafana对接可以实现更加丰富和美观的数据可视化,可以利用Grafana强大的可视化功能来展示Zabbix收集的数据。 Grafana 本身是提供了Zabbix的对接插件,开箱即用,安装好了之后点击 enable 一下就能启用。然后就…

深度学习中的Channel,通道数是什么?

参考文章: 直观理解深度学习的卷积操作,超赞!-CSDN博客​​​​​​如何理解卷积神经网络中的通道(channel)_神经网络通道数-CSDN博客 深度学习-卷积神经网络—卷积操作详细介绍_深度卷积的作用-CSDN博客 正文&…

护网在即,助力安服仔漏洞扫描~

整合了个漏扫系统,安服仔必备~ 使用场景 网前布防,漏洞扫描,资产梳理 使用方法: 启动虚拟机后运行命令: ./StartSystemScript.sh 输入密码attack 启动完成后浏览器打开网站: http://IP:5000 相关账户…

VSCode神仙插件——Codeium (AI编程助手)

1、安装&登录插件 安装过程中会让你登录Codeium账户,可以通过Google账户登录,或者可以注册一个Codeium账户(如果没有弹出让你登录账户的界面,可以等安装结束后在右下角找到登录的地方) 右下角显示如下图所示&#…

异常组成、作用、处理方式(3种)、异常方法、自定义异常

目录 异常的组成:运行异常与编译异常 两者区别:编译异常用来提醒程序员,运行异常大部分是由于参数传递错误导致 异常作用: 作用1:就是平时的报错,方便我们找到报错的来源 作用2:在方法内部…

计算机网络性能指标概述:速率、带宽、时延等

在计算机网络中,性能指标是衡量网络效率和质量的重要参数。本文将综合三篇关于计算机网络性能指标的文章,详细介绍速率、带宽、吞吐量、时延、时延带宽积、往返时延(RTT) 和利用率的概念及其在网络中的应用。 1. 速率(…

windows系统本地端口被占用的问题

第一步:查找所有运行的端口 按住“WindowsR”组合键,打开命令窗口,输入【cmd】命令,回车。在弹出的窗口中输入 命令【netstat -ano】,再按一下回车键 Win系统端口被占用-查找所有运行的端口 第二步:查看…

整洁架构SOLID-单一职责原则(SRP)

文章目录 定义案例分析重复的假象代码合并解决方案 小结 定义 SRP是SOLID五大设计原则中最容易被误解的一个。也许是名字的原因,很多程序员根据SRP这个名字想当然地认为这个原则就是指:每个模块都应该只做一件事。 在历史上,我们曾经这样描…

CSS技巧:纯CSS实现文字渐变动画效果

文字渐变动画&#xff0c;可以实现的有两种&#xff1a;一种是一行文字整体变化颜色&#xff1b;另一种一行文字依次变化颜色。接下来&#xff0c;我就介绍一下这两种文字渐变的实现过程。 布局代码&#xff1a; <div class"con"><div class"animate…

GPIO配置-PIN_Speed的理解

在使用STM32的GPIO 口配置时&#xff0c;经常会疑惑应该选用什么样的配置模式&#xff0c;本文谈谈对pin_speed的理解。 根据数据手册可得&#xff0c;STM32提供10MHz,2MHz和50MHz三种输出速度的配置&#xff0c;三种配置的应用场景是怎么样的&#xff1f;。 1.为什么要配置引…

力扣双指针算法题目:快乐数

目录 1.题目 2.思路解析 3.代码展示 1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 题目意思是将一个正整数上面的每一位拿出来&#xff0c;然后分别求平方&#xff0c;最后将这些数字的平方求和得到一个数字&#xff0c;如此循环&#xff0c;如果在此循环中…

OpenEarthMap:全球高分辨率土地覆盖制图的基准数据集(开源来下载!!!)

OpenEarthMap由220万段5000张航拍和卫星图像组成&#xff0c;覆盖6大洲44个国家97个地区&#xff0c;在0.25-0.5m的地面采样距离上人工标注8类土地覆盖标签。我们提供8类标注:裸地、牧场、已开发空间、道路、树木、水、农业用地和建筑。类选择与现有的具有亚米GSD的产品和基准数…

C#知识|项目的实施过程及通用三级架构的搭建笔记

哈喽,你好啊,我是雷工! 01 项目需求分析 根据与需求方沟通,分析需求,一般都有需求分析师来进行项目需求收集与分析。 根据需求文档进行项目功能设计。 02 框架的选择 ①小项目可以根据需求选择两层或三层结构。 ②中型大型项目,至少需要三层架构和其他架构的组合。 03 框…

ESP32 步进电机精准控制:打造高精度 DIY 写字机器人,实现流畅书写体验

摘要: 想让你的 ESP32 不再仅仅是控制灯光的工具吗&#xff1f; 本文将带你使用 ESP32 开发板、步进电机和简单的机械结构打造一个能够自动写字的机器人。我们将深入浅出地讲解硬件连接、软件代码以及控制逻辑&#xff0c;并提供完整的项目代码和电路图&#xff0c;即使是 Ardu…