《数据结构学习笔记---第九篇》---循环队列的实现

   文章目录

1.循环队列的定义

2.循环队列的判空判满

3.创建队列并初始化

4.入队和出队

5. 返回队尾队首元素

6.释放循环队列


1.循环队列的定义

定义:存储队列元素的表从逻辑上被视为一个环。

       

我们此次实现的循环队列,采用顺序表

typedef struct {int*a;int front;int rear;int k;} MyCircularQueue;

本质上是一个出入受限的顺序表,那我们是怎么实现他的环状结构的呢?毕竟顺序表是一个线性的结构而不是环状的。

答  他用取模运算刚好在存储空间上变成了“环状”。

例如:我们要走一个环状顺序表

如果我们将rear=1;front=2在逻辑上我们可以正常移动,但其实我们物理存储上的指针已经溢出了,所以我们刚好可以取模来控制指针的移动。

如果我们尾指针前进一步就可以(Q.rear+1)% k,刚好可以到达front的位置。

2.循环队列的判空判满

如图我们可以看到,此时rear==front既可以是判空的条件,也可以是判满的条件,那我们应该怎么区分呢?有三种方法://这里的指针变量会和题目中的不太一样,但是判断逻辑相同

1.牺牲一个单元来进行区分

队满:(Q.rear+1)%MaxSize ==Q.front;

队空:   Q.front==Q.rear

2.设置一个Size表示队列元素长度来判断。

队满:Size==MaxSize;

队空:Size==0

3.设置一个 tag标记

tag==0&& Q.front==Q.rear,队空;

tag==1&& Q.front==Q.rear,队满。

  • isEmpty(): 检查循环队列是否为空。
  • isFull(): 检查循环队列是否已满。

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {assert(obj);if(obj->rear==obj->front ){return  true;}return false ;
}bool myCircularQueueIsFull(MyCircularQueue* obj) {assert(obj);if((obj->rear+1)%(obj->k+1)==obj->front ){return  true;}return false ;
}

3.创建队列并初始化

MyCircularQueue(k): 构造器,设置队列长度为 k 

MyCircularQueue* myCircularQueueCreate(int k)
{MyCircularQueue*obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));//创建一个循环的队列结构体指针节点obj->a=(int*)malloc(sizeof(int)*(k+1)) ;//队列长度为k,但是要多一个空间用来判断空还是满obj->front=obj->rear=0;obj->k=k;return obj;
}

    队列长度为k,但是要多一个空间用来判断空还是满 ,所以我们用的是第一种判空判满策略,牺牲一个存储空间

4.入队和出队

入队操作:    obj->a[obj->rear]=value;
                    obj->rear=(obj->rear+1)%(obj->k+1);//  先赋值再移动指针

出队操作:   obj->front=(obj->front+1)%(obj->k+1);// 直接移动指针

  • enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。
  • deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {assert(obj);if (myCircularQueueIsFull(obj)){return false;}obj->a[obj->rear]=value;obj->rear=(obj->rear+1)%(obj->k+1);return true;}bool myCircularQueueDeQueue(MyCircularQueue* obj) {assert(obj);if (myCircularQueueIsEmpty(obj)){return false;}obj->front=(obj->front+1)%(obj->k+1);return true;
}

5. 返回队尾队首元素

  • Front: 从队首获取元素。如果队列为空,返回 -1 。
  • Rear: 获取队尾元素。如果队列为空,返回 -1 。
int myCircularQueueFront(MyCircularQueue* obj) {assert(obj);if (myCircularQueueIsEmpty(obj)){return -1;}return obj->a[obj->front];}int myCircularQueueRear(MyCircularQueue* obj) {assert(obj);if (myCircularQueueIsEmpty(obj)){return -1;}else{int rear=obj->rear==0 ? obj->k : obj->rear-1;return obj->a[rear];  }
}

int rear=obj->rear==0 ? obj->k : obj->rear-1;  由于队尾后面还有一个用于判空判满的空间,如果rear刚好指向这片空间,他实际上是指向的真正的队尾下标为k;如果不为0说明他指向的空间为正常的前驱结点。

 6.释放循环队列

 切记:  先释放结构体指针指向的创建的队列所在的空间,再去释放结构体指针的空间。

void myCircularQueueFree(MyCircularQueue* obj) {free(obj->a);free(obj);
}

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

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

相关文章

Xception模型详解

简介 Xception的名称源自于"Extreme Inception",它是在Inception架构的基础上进行了扩展和改进。Inception架构是Google团队提出的一种经典的卷积神经网络架构,用于解决深度卷积神经网络中的计算和参数增长问题。 与Inception不同&#xff0…

图像生成:SD lora加载代码详解与实现

文章目录 前言一、SD模型介绍二、模型加载1. 模型架构加载2. safetensors权重加载3. lora权重加载 三、Name匹配四、权重融合1、构建net类2、匹配lora weight和model weight3、基于lora权重创建lora模块4、权重融合 五、整体pipeline总结 前言 SD中lora的加载相信都不陌生&…

VSCode美化

今天有空收拾了一下VSCode,页面如下,个人觉得还是挺好看的~~ 1. 主题 Noctis 色彩较多,有种繁杂美。 我使用的是浅色主题的一款Noctis Hibernus 2. 字体 Maple Mono 官网:Maple-Font 我只安装了下图两个字体,使…

堆积排序python实现

堆积排序(Heap Sort)是一种基于二叉堆的排序算法。Python语言实现堆积排序算法可以如下所示: def heapify(arr, n, i):largest = i # Initialize largest as rootl = 2 * i + 1 # left = 2*i + 1r = 2 * i + 2

Java常用API之Encoders类解读

写在开头:本文用于作者学习Java常用API 我将官方文档中Collections类中所有API全测了一遍并打印了结果,日拱一卒,常看常新 在Spark中,Encoders类提供了一些静态方法用于创建不同数据类型的编码器。 首先,我遇到这样…

区块链面试题总结

1、什么是区块链? 区块链是不间断的经济交易数字分类账,可以进行编程,以记录不止金融交易,还可以记录其他有价值的东西,简单来说,区块链是一个不可变记录的分布式数据库,该数据库由计算机集群来…

今后的推进计划方针

今后的推进计划方针 信息数学物理 信息 线段树,其它的随缘。 数学 三角函数(必修3)-> 对数函数和指数函数 物理 随缘

Docker部署Nexus Maven私服并且实现远程访问Nexus界面

目录 ⛳️推荐 1. Docker安装Nexus 2. 本地访问Nexus 3. Linux安装Cpolar 4. 配置Nexus界面公网地址 5. 远程访问 Nexus界面 6. 固定Nexus公网地址 7. 固定地址访问Nexus ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默&am…

使用混沌加密图像(MATLAB)

logistic图像加密是一种基于混沌理论的加密算法,它利用混沌系统的特性,如敏感依赖于初始条件和参数的非线性动态行为,来生成密钥和进行加密解密操作。以下是逻辑加密的基本原理和过程: 基本原理: 混沌系统特性利用:逻辑加密基于混沌系统的特性,利用混沌系统的非线性、不…

Vue3:使用Pinia的$subscribe+localStorage实现数据存储

一、情景说明 我们学习Vue的时候,知道可以用watch来监听数据的变化 那么,Pinia的store中的数据发生变化,如何监听了? 这里就用到$subscribe来实现效果 这一篇,$subscribelocalStorage实现数据存储的案例&#xff0c…

Nginx开发实战三:替换请求资源中的固定数据

文章目录 1.效果预览2.下载Nginx解压并初始化3.字符串替换模块安装4.修改nginx配置文件并重启 1.效果预览 页面初始效果 页面替换后效果 说明:页面是内网的一个地址,我们通过nginx可以很便捷的将其改为外网访问,但是在外网访问这个地址后&#xff0c…

windows 使用 wsl 安装 linux 子系统

windows 使用 wsl 安装 linux 子系统 介绍使用如何启动设置基本配置安装和配置 SSH 服务 介绍 WSL(Windows Subsystem for Linux)是微软为Windows 10和Windows 11操作系统提供的一个功能,它允许用户在Windows上直接运行GNU/Linux环境。WSL提…

剑指offer--数组中重复的数字

一.题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 算法1.排序,然后遍历,时间复杂度O(nlogn),空…

私域流量黄金时代:SCRM赋能企业深度运营

随着互联网的不断发展,私域流量已成为企业运营中不可或缺的一部分。私域流量不仅代表着企业的忠实用户群体,更是企业进行精细化运营、提升品牌价值的重要阵地。在这样的背景下,社会化客户关系管理(SCRM)应运而生&#…

SpringBoot + Redis 实现接口限流,一个注解的事

Redis 除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用 Redis 处理接口限流。 1. 准备工作 首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而注解是通…

【力扣一刷】代码随想录day28(93.复原IP地址、78.子集、90.子集II )

目录 【93.复原IP地址】中等题(偏难,坑很多) 【78.子集】中等题(偏简单) 【90.子集II】中等题 【93.复原IP地址】中等题(偏难,坑很多) 思路:以101023为例子 1、将题目…

输出100~200之间的素数(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现素数判断函数&#xff1b; int Prime(int number) {//初始化变量值&#xff1b;int divided 2;int JudgementCondition 0;//循环判断素数&#xff1b;wh…

(C)1007 素数对猜想

1007 素数对猜想 问题描述 输入样例&#xff1a; 20 输出样例&#xff1a; 4 解决方案&#xff1a; #include<stdio.h> #include<string.h> #include<math.h> int main(){int n,d;int a[100000];int flag,jishu0;scanf("%d",&n);memset(a,-1,…

基于51单片机甲醛浓度检测设计

基于51单片机甲醛浓度检测设计 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;PCB&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.甲醛浓度数据经过单片机处理&#xff0c;由LCD1602实时显示。 2.可通过按键设置甲醛报警阈值&#xff…

RK3568驱动指南|第十四篇 单总线-第158章DS18B20编写字符设备驱动框架

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…