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

循环队列与循环双端队列

文章目录

  • 前言
  • 循环队列
  • 循环双端队列


前言

1、学习循环队列和循环双端队列能加深我们对队列的理解,提高我们的编程能力。
2、本文循环队列使用的是数组,循环双端队列用的是双向链表
3、题目连接:设计循环队列 ,设计循环双端队列。

循环队列

1、什么是循环队列?

循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。

在这里插入图片描述

2、实现的功能

(1)MyCircularQueue(k): 构造器,设置队列长度为 k 。
(2)Front: 从队首获取元素。如果队列为空,返回 -1。
(3)Rear: 获取队尾元素。如果队列为空,返回 -1 。
(4)enQueue(value):向循环队列插入一个元素。如果成功插入则返回真。
(5)deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
(6)isEmpty(): 检查循环队列是否为空。
(7)isFull(): 检查循环队列是否已满。

3、设计
有两种方案:a:利用数组来存储数据,b:利用链表来存储数据
我们这里使用数组的方式
(1)我们设置一个头指针,和一个尾指针(指的时最后一个有数据位置的下一个位置,为什么不直接指向最后有数据那个位置呢?因为这样能更好的判断队列是否为空和队列是否已经满的情况),头指针(front),尾指针(rear),容量(k)。

(2) 为了解决尾指针指向最后一个数据后一个的问题,我们可以多申请一个空间,就不会使尾指针指的位置超出数组了,这个问题也叫假溢出。

(3)判断空,当front=rear时为空
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d05483fe9eb840fdad065ce02b088b52.png

(4)判断满,当 front=(rear+1)%(k+1) 为空

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/d06eadb22f7048aa8ede33702d1e9548.png

(5)删除队头元素,使front=(front+1)%(k+1)即可, 也可以通过判断front是否在(k+1)的位置,在的话就使front=0,不在的话front=front+1即可

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/14aff520fd254a0a9b2751cf622e4a82.png

(6)进队,将数据放到数组下标rear位置上,然后使 rear=(rear+1)%(k+1) 即可,原理同上。

(7)获取队头元素,直接返回队头下标的位置的数据即可

(8)获取队尾元素,返回 (rear-1+k+1)%(k+1) 位置的数据即可,也可以判断rear是不是在0的位置,在的话top=k,不在0的位置的话就top=rear-1
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fad58d936d8b45a0b6b65024f18fd026.png

4、代码实现:

//队列结构体
typedef struct {//储存数据int *arr;//头int front;//指向尾的下一个int rear;//大小int k;
} MyCircularQueue;//初始化循环队列
MyCircularQueue* myCircularQueueCreate(int k) {//队列MyCircularQueue* obj=( MyCircularQueue*)malloc(sizeof(MyCircularQueue));//初始化成员obj->arr=(int*)malloc(sizeof(int)*(k+1));obj->front=0;obj->rear=0;obj->k=k;return obj;
}//是否为空
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {//当队头的下标等于队尾的下标时队列为空return obj->front==obj->rear;
}//是否为满
bool myCircularQueueIsFull(MyCircularQueue* obj) {//当队头的下标等于队尾加一模上k+1时队列满了return obj->front==(obj->rear+1)%(obj->k+1);
}//入队
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//当队列满了就返回falseif(myCircularQueueIsFull(obj))return false;//放到rear位置上obj->arr[obj->rear]=value;//这样当rear+1==k+1时,让rear回到0这个位置上obj->rear=(obj->rear+1)%(obj->k+1);return true;
}//出队
bool myCircularQueueDeQueue(MyCircularQueue* obj) {//空时返回falseif(myCircularQueueIsEmpty(obj))return false;//队头下标加1,莫上k+1当front+1==k+1时能回到0那个位置obj->front=(obj->front+1)%(obj->k+1);return true;
}//查看头元素
int myCircularQueueFront(MyCircularQueue* obj) {//空时返回-1if(myCircularQueueIsEmpty(obj))return -1;//直接展示front位置即可int tmp=obj->arr[obj->front];return tmp;
}//查看队尾元素
int myCircularQueueRear(MyCircularQueue* obj) {//空时返回-1if(myCircularQueueIsEmpty(obj))return -1;//因为返回的是rear-1位置上的数据,当rear>0时,查看的位置时rear-1,当rear=0时就是查看k位置的数据了int tmp=obj->arr[(obj->rear-1+obj->k+1)%(obj->k+1)];return tmp;}//释放
void myCircularQueueFree(MyCircularQueue* obj) {free(obj->arr);free(obj);
}

循环双端队列

1、循环双端队列就是在循环队列的基础上增加了一些接口,如:可以进行队头的插入,进行尾部的删除。

2、实现的功能接口:

实现 MyCircularDeque 类:

(1)MyCircularDeque(int k) :构造函数,双端队列最大为 k 。

(2)boolean insertFront():将一个元素添加到双端队列头部。 如果操作成功返回 true ,否则返回 false 。

(3)boolean insertLast() :将一个元素添加到双端队列尾部。如果操作成功返回 true ,否则返回 false 。

(4)boolean deleteFront() :从双端队列头部删除一个元素。 如果操作成功返回 true ,否则返回 false 。

(5)boolean deleteLast() :从双端队列尾部删除一个元素。如果操作成功返回 true ,否则返回 false 。

(6)int getFront() ):从双端队列头部获得一个元素。如果双端队列为空,返回 -1 。

(7)int getRear() :获得双端队列的最后一个元素。 如果双端队列为空,返回 -1 。
(8) boolean isEmpty() :若双端队列为空,则返回 true ,否则返回 false 。

(9)boolean isFull() :若双端队列满了,则返回 true ,否则返回 false 。

3、设计
(1)用双向链表的节点,这样方便找到尾部的上一个节点,利于队尾的删除。
(2)定义size来判断空和满,再定义两个节点指针,分别指向队头(front)队尾(rear)容量(k)前驱指针(next)后驱指针(next1)
(3)判断为空,当size=0时为空。
(4)判断是否满,当size=k时为满。
(5)队头插入数据,申请一个节点tmp,再将tmp和front连起来,最后front=tmp即可

在这里插入图片描述

(6)队尾插入数据,申请一个节点tmp,再将tmp和rear连接起来,最后rear=tmp即可
在这里插入图片描述

(7)队头删除,先保存队头的后一个节点next,再将front释放,最后将front=next并把front->next1=NULL即可,注意顺序不能乱。

在这里插入图片描述

(8)队尾删除,先保存前一个节点next1,再将rear释放,最后将rear=next1并把rear->next=NULL即可,注意顺序不能乱。

在这里插入图片描述

(9)获取队头元素,直接返回front的数据即可。
(10)获取队尾元素,直接返回rear的数据即可。

4、代码实现:

//双向链表的结构体
typedef struct  ls
{//前驱struct ls *next;//后驱struct ls *next1;//数据int val;
}ls;class MyCircularDeque {
public://初始化MyCircularDeque(int k) {//容量this->k=k;//大小this->size=0;this->rear=NULL;this->front=NULL;}//队头插入数据bool insertFront(int value) {//  满了,就返回if(isFull())return false;//没满//申请一个节点ls *tmp(ls*)malloc(sizeof(ls));tmp->next=NULL;tmp->next1=NULL;tmp->val=value;//空的话头和尾指向第一个节点if(front==NULL){front=rear=tmp;}//不空,插入头else{front->next1=tmp;tmp->next=front;front=tmp;}//大小加1size++;return true;}//队尾插入数据bool insertLast(int value) {if(isFull())return false;//申请节点ls *tmp=(ls*)malloc(sizeof(ls));tmp->next=NULL;tmp->next1=NULL;tmp->val=value;if(rear==NULL){front=rear=tmp;}//尾插到rear后面else{tmp->next1=rear;rear->next=tmp;rear=tmp;}//大小加1size++;return true;}//删队头   bool deleteFront() {//为空if(isEmpty())return false;//只有一个元素ls *tmp=front->next;free(front);if(tmp==NULL)front=rear=tmp;//多个元素else{front=tmp;front->next1=NULL;}//大小-1     size--;return true;}//删队尾bool deleteLast() {if(isEmpty())return false;//只有一个元素ls *tmp=rear->next1;free(rear);if(tmp==NULL){rear=front=tmp;}else{tmp->next=NULL;rear=tmp;}// 大小-1size--;return true;}//显示头元素int getFront() {//为空if(isEmpty())return -1;//直接返回头节点的数据return front->val;}//显示尾节点元素int getRear() {//为空if(isEmpty())return -1;//直接返回尾节点数据return rear->val;}//判断是否为空bool isEmpty() {//当size==0是为空return size==0;}//判断是否为满bool isFull() {//size==k就满了return size==k;}//释放链表~MyCircularDeque(){ls* tmp=front;while(tmp){ls*p=tmp->next;free(tmp);tmp=p;}}//头和尾ls* front;ls* rear;//容量和大小int k;int size;
};

以上就是我的分享了

最后,感谢大家的观看!

相关文章:

循环队列与循环双端队列

文章目录 前言循环队列循环双端队列 前言 1、学习循环队列和循环双端队列能加深我们对队列的理解,提高我们的编程能力。 2、本文循环队列使用的是数组,循环双端队列用的是双向链表 3、题目连接:设计循环队列 ,设计循环双端队列。 …...

https【详解】与http的区别,对称加密,非对称加密,证书,解析流程图

http 和 https 的区别 http 是明文传输,敏感信息容易在传输过程中被劫持https http加密,劫持了也无法解密 https 用到的加密方式 https 同时使用了对称加密和非对称加密,之所以没有全部使用非对称加密,是因为非对称加密的运算更加…...

(C语言)qsort函数模拟实现

前言 我们需先了解qsort函数 qsort函数详解:http://t.csdnimg.cn/rTNv9 qsort函数可以排序多种数据类型,很是神奇,这是为什么,我们在里模拟实现这样的功能 目录 1. qsort函数模拟实现 2. 我们使用bubble_sort函数排序整形数…...

WordPress建站入门教程:如何在本地电脑搭建WordPress网站?

前面跟大家分享了『WordPress建站入门教程:如何安装本地WordPress网站运行环境?』,接下来boke112百科就继续跟大家分享本地电脑如何搭建WordPress网站。 小皮面板(phpstudy)的“软件管理 – 网站程序”虽然可以一键部…...

Vue3教程

1.1 配置环境 vue官网: Vue.js - The Progressive JavaScript Framework | Vue.js 终端 Linux和Mac上可以用自带的终端。 Windows上推荐用powershell或者cmd。Git Bash有些指令不兼容。 安装Nodejs 安装地址: Node.js 安装vue/cli 打开Git Bash&#x…...

Linux系统Docker部署RStudio Server

文章目录 前言1. 安装RStudio Server2. 本地访问3. Linux 安装cpolar4. 配置RStudio server公网访问地址5. 公网远程访问RStudio6. 固定RStudio公网地址 前言 RStudio Server 使你能够在 Linux 服务器上运行你所熟悉和喜爱的 RStudio IDE,并通过 Web 浏览器进行访问…...

【C++】每周一题——2024.3.3(手滑再再写一篇)

题目 Cpp 【问题描述】 求N个字符串的最长公共子串&#xff0c;2 < N&#xff1c;&#xff1d;20&#xff0c;字符串长度不超过255。 例如&#xff1a;N&#xff1d;3&#xff0c;由键盘依次输入三个字符串为 What is local bus? Name some local buses. local bus is a h…...

TabLayout与ToolBar、ViewPager的使用

目录 1. 在ToolBar中添加TabLayout 2. 将工具栏设为活动栏 3. 初始化TabLayout 4. TabLayout监听器 可以在ToolBar工具栏中添加TabLayout配合&#xff0c;效果如下图。 1. 在ToolBar中添加TabLayout TabLayout的常用属性有&#xff1a; tabBackground 指定标签的背景 t…...

链表基础知识详解(非常详细简单易懂)

概述&#xff1a; 链表作为 C 语言中一种基础的数据结构&#xff0c;在平时写程序的时候用的并不多&#xff0c;但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛&#xff0c;所以必须要搞懂链表&#xff0c;链表分为单向链表和双向链表&#xff0c;单向链表很…...

SAP PP学习笔记05 - BOM配置(Customize)1 - 修正参数

上次学习了BOM相关的内容。 SAP PP学习笔记04 - BOM1 - BOM创建&#xff0c;用途&#xff0c;形式&#xff0c;默认值&#xff0c;群组BOM等_sap销售bom与生产bom-CSDN博客 SAP PP学习笔记04 - BOM2 -通过Serial来做简单的BOM变式配置&#xff0c;副明细&#xff0c;BOM状态&…...

前端从普通登录到单点登录(SSO)

随着前端登录场景的日益复杂化和技术思想的不断演进&#xff0c;前端在登录方面的知识结构变得越来越复杂。对于前端开发者来说&#xff0c;在日常工作中根据不同的登录场景提供合适的解决方案是我们的职责所在&#xff0c;本文将梳理前端登录的演变过程。 1、无状态的HTTP H…...

考研总计划(基础篇)

分为数学&#xff0c;专业课&#xff0c;英语三个部分 数学规划表 高数基础&#xff1a;3月初到4月15号 具体实行计划&#xff1a;分为看课日和写题日 看课日:早上10点到12点半看课&#xff0c;19:30到21:30继续看课。 写题日:早上10点到12点半复习前一天的题目&#xff0…...

力扣周赛387

第一题 代码 package Competition.The387Competitioin;public class Demo1 {public static void main(String[] args) {}public int[] resultArray(int[] nums) {int ans[]new int[nums.length];int arr1[]new int[nums.length];int arr2[]new int[nums.length];if(nums.leng…...

部署PhotoMaker通过堆叠 ID 嵌入自定义逼真的人物照片

PhotoMaker只需要一张人脸照片就可以生成不同风格的人物照片&#xff0c;可以快速出图&#xff0c;无需额外的LoRA培训。 安装环境 python 3.10gitVisual Studio 2022 安装依赖库 git clone https://github.com/bmaltais/PhotoMaker.git cd PhotoMaker python -m venv venv…...

挑战杯 基于深度学习的中文情感分类 - 卷积神经网络 情感分类 情感分析 情感识别 评论情感分类

文章目录 1 前言2 情感文本分类2.1 参考论文2.2 输入层2.3 第一层卷积层&#xff1a;2.4 池化层&#xff1a;2.5 全连接softmax层&#xff1a;2.6 训练方案 3 实现3.1 sentence部分3.2 filters部分3.3 featuremaps部分3.4 1max部分3.5 concat1max部分3.6 关键代码 4 实现效果4.…...

关于RSA公私钥加密报错Data must not be longer than 117 bytes问题解决办法

一、问题描述 1.背景 大家都知道&#xff0c;在日常项目开发过程中&#xff0c;数据的传输安全一直都是值得重视的问题&#xff0c;当然了市面上解决此类办法的技术也有很多&#xff0c;本项目在提供给第三方使用是数据以及校验第三方传递的参数&#xff0c;采用常用的RSA公私…...

【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0

目录 一、 Kubernetes 的概述 二、服务器配置 2.1 服务器部署规划 2.2服务器初始化配置 三、安装Docker/kubeadm/kubelet【所有节点】 3.1 安装Docker 3.2 添加阿里云YUM软件源 3.3 安装kubeadm&#xff0c;kubelet和kubectl 四、部署Kubernetes Master 五、部署Kube…...

Android 开发环境搭建的步骤

本文将为您详细讲解 Android 开发环境搭建的步骤。搭建 Android 开发环境需要准备一些软件和工具&#xff0c;以下是一些基础步骤&#xff1a; 1. 安装 Java Development Kit (JDK) 首先&#xff0c;您需要安装 Java Development Kit (JDK)。JDK 是 Android 开发的基础&#xf…...

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类&#xff0c;可能会这样子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…...

数字化转型导师鹏:政府数字化转型政务服务类案例研究

政府数字化转型政务服务类案例研究 课程背景&#xff1a; 很多地方政府存在以下问题&#xff1a; 不清楚标杆省政府数字化转型的政务服务类成功案例 不清楚地级市政府数字化转型的政务服务类成功案例 不清楚县区级政府数字化转型的政务服务类成功案例 课程特色&#x…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP

编辑-虚拟网络编辑器-更改设置 选择桥接模式&#xff0c;然后找到相应的网卡&#xff08;可以查看自己本机的网络连接&#xff09; windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置&#xff0c;选择刚才配置的桥接模式 静态ip设置&#xff1a; 我用的ubuntu24桌…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...