当前位置: 首页 > news >正文

栈和队列---循环队列

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

相关文章:

栈和队列---循环队列

1.循环队列的出现 (1)上面的这个就是一个普通的数据的入队和出队的过程我们正常情况下去实现这个入队和出队的过程,就是这个数据从这个队尾进入,从队头离开,但是这个加入的时候肯定是没有其他的问题的,直接…...

打卡第4天----链表

通过学习基础,发现我的基本功还得需要再练练,思路得再更加清晰明了,这样子做算法题才能驾轻就熟。每天记录自己的进步。 一、两两交换 题目编号:24 题目描述: 给你一个链表,两两交换其中相邻的节点&#x…...

07-7.1.1 查找的基本概念

👋 Hi, I’m Beast Cheng 👀 I’m interested in photography, hiking, landscape… 🌱 I’m currently learning python, javascript, kotlin… 📫 How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…...

【数据结构与算法】快速排序双指针法

💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法》 期待您的关注 ​...

GESP C++一级真题

PDF图片1-7 点赞❤️关注😍收藏⭐️ 互粉必回🙏🙏🙏...

短信验证码实现

一、设置AccessKey 创建用户并配置使用权限,使我们拥有调用 aliyunAPI 的权限,之后会生成 AccessKeyID 和 AccessKey密码,后面我们会使用到。需要注意的是 AccessKeyID 和 AccessKey密码生成后我们需要将他保存起来,否则后期无法查…...

pnpm的坑

请问pnpm的两个坑怎么解决: 第一个坑:没有节省磁盘空间 我已经配置了依赖的存储位置, 但我在项目里pnpm install以后,发现依赖包还是很大, 然后发现里面的链接并不是指向先前配置的依赖存储位置,而是指…...

如何监控和分析 PostgreSQL 中的查询执行计划?

文章目录 一、为什么监控和分析查询执行计划很重要二、PostgreSQL 中用于获取查询执行计划的方法三、理解查询执行计划的关键元素四、通过示例分析查询执行计划五、优化查询执行计划的常见策略六、使用工具辅助分析七、结合实际案例的详细分析八、总结 在 PostgreSQL 数据库中&…...

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码,我们用到的是tianai-captcha。 文档地址:http://doc.captcha.tianai.cloud/ 源码地址:https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…...

三坐标测量机:柔性生产制造中的高精度测量解决方案

柔性生产制造是制造业的核心竞争力之一。它强调生产线的灵活性和适应性,以满足市场对产品多样化和个性化的需求。在当今快速变化的工业环境中,随着消费者对产品个性化和定制化需求的增加,柔性生产制造和三坐标测量机的结合,为智能…...

puppeteer 爬虫初探

1. puppeteer 和 puppeteer-core 安装 puppeteer 会默认下载一个最新版本的 chrome 浏览器; 安装 puppeteer-core ,不会安装 chrome, 若要程序打开浏览器运行时,需手动指定电脑系统安装的 chrome 浏览器路径; 2. puppeteer-core …...

Pandas 入门 15 题

Pandas 入门 15 题 1. 相关知识点1.1 修改DataFrame列名1.2 获取行列数1.3 显示前n行1.4 条件数据选取值1.5 创建新列1.6 删去重复的行1.7 删除空值的数据1.9 修改列名1.10 修改数据类型1.11 填充缺失值1.12 数据上下合并1.13 pivot_table透视表的使用1.14 melt透视表的使用1.1…...

使用微信开发者工具连接gitee

编写代码 打开微信开发者工具 编写小程序代码 提交代码 在微信开发者工具提交代码到gitee仓库的步骤: 1.在gitee创建仓库,得到仓库url 2.微信开发者工具设置远程仓库 点击版本管理-->点击设置-->网络和认证-->认证方式选择 使用用户名和…...

论文复现-基于决策树算法构建银行贷款审批预测模型(金融风控场景)

作者Toby,来源公众号:Python风控模型,基于决策树算法构建银行贷款审批预测模型 目录 1.金融风控论文复现 2.项目背景介绍 3.决策树介绍 4.数据集介绍 5.合规风险提醒 6.技术工具 7.实验过程 7.1导入数据 7.2数据预处理 7.3数据可…...

力扣225题解析:使用队列实现栈的三种解法(Java实现)

引言 在算法和数据结构中,如何用队列实现栈是一个常见的面试题和实际应用问题。本文将探讨力扣上的第225题,通过不同的方法来实现这一功能,并分析各种方法的优劣和适用场景。 问题介绍 力扣225题目要求我们使用队列实现栈的下列操作&#…...

网络协议与标准

协议: 语法 ;计算机的算法,二进制 语义 ;不要有出现歧义的 同步 ; 同步还原信息,收发同步 标准: ISO(国际标准化组织) IEEE(电气和电子工程师学会) 局域网技术 一.协议…...

154. 寻找旋转排序数组中的最小值 II(困难)

154. 寻找旋转排序数组中的最小值 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:154. 寻找旋转排序数组中的最小值 II 2.详细题解 该题是153. 寻找旋转排序数组中的最小值的进阶题,在153. 寻找旋转排序数组中的最小值…...

5、MP4解复用---AAC+H264

MP4 MP4同样是一种容器格式,是由一个一个Box组成,每个Box又分为Header与Data,Data又包含很多子Box,具体的MP4文件结构也看过,内部Box结构比较复杂,一般不写MP4解释器的话,Box结构不用了解太细&a…...

计算样本之间的相似度

文章目录 前言一、距离度量1.1 欧几里得距离(Euclidean Distance)1.2 曼哈顿距离(Manhattan Distance)1.3 切比雪夫距离(Chebyshev Distance)1.4 闵可夫斯基距离(Minkowski Distance&#xff09…...

2-5 softmax 回归的简洁实现

我们发现通过深度学习框架的高级API能够使实现线性回归变得更加容易。 同样,通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上节中一样, 继续使用Fashion-MNIST数据集,并保持批量大小为256。 import torch from torc…...

三体问题详解

从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

Android15默认授权浮窗权限

我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性&#xf…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

ubuntu中安装conda的后遗症

缘由: 在编译rk3588的sdk时,遇到编译buildroot失败,提示如下: 提示缺失expect,但是实测相关工具是在的,如下显示: 然后查找借助各个ai工具,重新安装相关的工具,依然无解。 解决&am…...

Java中HashMap底层原理深度解析:从数据结构到红黑树优化

一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...

Linux入门课的思维导图

耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...