画图以及代码分析结合的循环队列的实现

news2024/12/27 19:25:12

循环队列的实现

  • 概念以及结构
  • 实现
    • 初始化
    • 判空
    • 判满
    • 入队
    • 出队
    • 从队头获得元素
    • 从队尾获得元素
    • 释放

概念以及结构

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

循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。
在这里插入图片描述
队尾指针永远指向队尾元素的下一个位置。

实现

循环队列既可以选择用数组实现也可以选择用链表(循环链表)实现。我们看看下面情况在来看看选什么结构时候循环队列。

队空
在这里插入图片描述
队满
在这里插入图片描述
在这里插入图片描述

既然是循环队列,那么数组下标到最后一个位置的下一个位置,这里需要特殊处理,让下标回到数组为0的地方,变成环的结构。而链表呢,我们只需要让它等于next就行了,不用特殊处理。从这个地方看链表似乎更像一个环,并且比数组更方便一些。我们先暂且不谈这个。

先谈谈如何判断队空队满的情况
能简单用Q.front == Q.back 进行判断吗?

那么下面这种情况是队空还是队满呢?

在这里插入图片描述
显然Q.front == Q.back 并不能帮我们直接判断队空,队满情况。

这里有两种方法解决
1.增加一个size变量。
Q.front == Q.back && size == 0 判空
Q.front == Q.back && size == Maxsize 判满
2.多申请一个空间。队满的时候留着一个空间不用。并不是说这个空间不能插入和删除数据。
有5个数据就申请6个空间。

现在队空,队满问题解决了,那我们回过头继续来看,相比于链表,数组在满的时候需要特殊处理一下,才能回到下标为0的位置,而链表直接去next就可以了,我们会感觉链表比数组更好一些。

那么我要取队尾元素呢,数组可以根据队尾下标-1去取。链表呢,是不是得遍历一下才能取到,不然的话就在来一个prev指针记录队尾前一个位置。要不考虑用双向循环链表,但是这弄得更麻烦了。并且我malloc申请空间得时候,数组可以一下就解决,链表需要循环申请并且链接起来,比较麻烦。

结论:数组和链表实现循环队列,各有优缺点,但是更多得选择数组来实现。下面的实现我采用得也是数组实现,来源于LeetCode一道题。622. 设计循环队列

初始化

在这里插入图片描述

typedef struct {
    int*a;
    int front;
    int back;
    int N;//空间大小
} MyCircularQueue;


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //初始化
    obj->a=(int*)malloc(sizeof(int)*(k+1));
    obj->front=obj->back=0;
    obj->N=k+1;

    return obj;
}

判空

bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
    return obj->front == obj->back;
}

判满

back下一个位置是front是满。

在这里插入图片描述

在这里插入图片描述

bool myCircularQueueIsFull(MyCircularQueue* obj) {
    return (obj->back+1)%obj->N == obj->front;
}

入队

在这里插入图片描述

在这里插入图片描述

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
    {
        return false;
    }
    else
    {
        obj->a[obj->back]=val;
        obj->back++;
        //当back是最后一个位置,需要回到下标为0的位置
        obj->back%=obj->N;
        return true;
    }
}

出队

在这里插入图片描述
在这里插入图片描述

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return false;
    }
    else
    {
        obj->front++;
        //当front是最后一个位置,需要回到下标为0的位置
        obj->front%=obj->N;
        return true;
    }
    
}

从队头获得元素

int myCircularQueueFront(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    else
    {
        return obj->a[obj->front];
    }
}

从队尾获得元素

返回队尾的后一个元素。
在这里插入图片描述
但是如果是下面这种情况需要处理一下,back在0的位置
在这里插入图片描述

int myCircularQueueRear(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
    {
        return -1;
    }
    else
    {
        return obj->a[(obj->back-1+obj->N)%obj->N];
    }

}

释放

为什么释放两次可以参考225. 用队列实现栈最后面的解释

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

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

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

相关文章

优化| 割平面算法(2): Cover Cuts, Strengthening, Separation及其拓展(理论与实战详解)

【MIP Cutting plane method】-1: Cover cuts MIP的标准形式什么是Cover CutsCover Cuts的详细案例Stronger Cover Cuts及其案例Separation for Cover Cuts用Separation生成 Cover Cuts的详细例子调用Gurobi验证Cover Cuts和Stronger Cover Cuts的作用线性松弛模型的解加入Cove…

领域分类/识别方案

将用户输入与预定义的领域进行匹配 针对领域分类任务,如上图所示,我们首先会从不同的业务中收集大量的业务数据,作为基础的训练数据,虽然这些数据来自不同的业务,但是依然存在一些问题,主要有以下两方面&am…

YOLOv7测距+碰撞检测

YOLOv7测距碰撞检测 1. 相关配置2. 测距原理3. 标定和测距4. 碰撞检测4.1 相关代码4.2 主代码 5. 实验效果 相关链接 1. YOLOV5 单目测距(python) 2. YOLOV7 单目测距(python) 3. 具体实现效果已在Bilibili发布,点击…

vscode+gdbserver实现图形化调试Linux应用

一、环境: 1.远程Linux主机Ubuntu22.04; 2.vscode 1.76 二、环境搭建 1.Ubuntu 安装gdb、gdbserver、openssh-server 2.vscode 安装Remote Development、C/C 3.远程连接Linux 点击左下角的绿色按钮,然后选择connect to host----->…

Day1 组队竞赛、删除公共字符

✨个人主页: 北 海 🎉所属专栏: C/C相关题解 🎃操作环境: Visual Studio 2019 版本 16.11.17 文章目录 选择题1.C基础语法 编程题组队竞赛删除公共字符 选择题 1.C基础语法 题目:以下程序的运行结果是&am…

RSA加密为什么能保证安全

问题:我们都知道RSA加密是安全的,但是我们在使用的使用,怎么使用才能保证数据的安全传输呢? 一、原则:公钥机密、私钥解密、私钥签名、公钥验签 公钥私钥都可以加密和解密数据,但是因为持有公钥和私钥的人…

【Elsevier】中科院2区TOP, 高被引119篇, 稳定检索22年, 1周可见刊,5月15截稿~

一、【期刊简介】 中科院2区软计算类SCI (TOP) 【期刊概况】IF:8.0-9.0, JCR1区, 中科院2区; 【终审周期】走期刊部系统,3-5个月左右录用; 【检索情况】SCI&EI双检;正刊; 【数据库收录年份】2001年&#xff1…

【测试】概念篇

目录 🌟一、了解软件测试 🌈1、什么是软件测试 🌈2、软件测试与开发的区别(常考) 🌈3、一个优秀的软件测试人员应该具备的素质 🌟二、需求与测试用例、软件错误,软件生…

一旦80%的开发人员都开始利用ChatGPT提升工作效率后,挑战与机遇在哪里?

其实我现在已经开始逐渐开始喜欢上ChatGPT了,上班时间摸摸鱼,和ChatGPT畅谈一下理想,遇见一些不太熟练的代码也懒得去上网查了,直接问一问ChatGPT,然后自己再放置到自己的代码里,改一改,很完美。…

快递出入库管理APP开发 收发快递更方便

网购的盛行让收发快递成为很多人日常生活必不可少的一个环节,对于快递公司来说,每天有那么多的快递,如果没有一个好用的管理系统的话,不仅麻烦还很容易出现纰漏,所以快递出入库管理APP软件就显得很必要了。 快递…

python-imageio库简单使用

目录 imread_v2() get_reader() 使用imageio方法将彩色视频变为黑白视频 相关:python-动图制作及分解_觅远的博客-CSDN博客 imageio是一个用于读取和写入图像及视频数据的库,支持多种格式,且可以使用NumPy数组进行操作。常用方法&#xff…

JS逆向 -- 某平台登录加密分析

一、打开网站,使用账号密码登录 账号:aiyou123.com 密码:123456 二、通过F12抓包,抓到如下数据,发现密码加密了 三、加密结果是32位,首先考虑是md5加密。 四、全局搜索pwd,点击右上角&#xf…

C# 纯text文本字符添加上下角标

工作的需求,需要在GridView列HeaderText中插入带入带有上标和下标的字符串,比如这样的一个字符串:。。 解决办法:使用转义字符加Unicode的NumEntity就可以实现了。定义字符串如下:"O"。其中O为 。 实现&…

Linux系统目录树结构以及解释

FHS标准 Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最…

rk平台调试音频(从驱动到apk)

需要实现的功能: 输入:hdmiin、uvc、mic可以实时切换 输出:耳机和HDMI OUT同时输出声音 这里注意:mic是存在hedset情况,4节耳机,即可输出又可输出同时进行 开发情况: 一、先熟悉大致的Andro…

【24】核心易中期刊推荐——图像处理研究大数据及智能处理研究

🚀🚀🚀NEW!!!核心易中期刊推荐栏目来啦 ~ 📚🍀 核心期刊在国内的应用范围非常广,核心期刊发表论文是国内很多作者晋升的硬性要求,并且在国内属于顶尖论文发表,具有很高的学术价值。在中文核心目录体系中,权威代表有CSSCI、CSCD和北大核心。其中,中文期刊的数…

springboot内嵌tomcat文件上传路径不存在问题原因

错误提示: 临时文件目录被删除,导致文件上传报错,我们使用的是linux系统,10天没有使用,就会被删除 代码: 解决办法: 配置文件中自定义临时文件上传目录 server:port: 9090tomcat:basedir: /crm/tmp 特殊情况: 当我上传小文件的时候可以上传成功,大文件的时候上传失败 猜测可…

利用Linux的corntab定时任务和shell脚本,解决傻妞卡死、发信息没反应、一直卡在即将重启、查询数据异常等问题

利用Linux的corntab定时任务和shell脚本,解决傻妞卡死、数据异常等问题 安装corntab创建shell脚本添加corntab定时任务 原理 定时杀死傻妞进程,并自动重启傻妞 安装corntab Linux crontab是用来定期执行程序的命令。 CentOS安装命令如下 yum -y insta…

【Android -- 开发工具】Source Insight 4.0 安装和使用教程

简介 Source Insight 工具是一款功能强大的代码阅读器,它能使大量的代码产生联系,方便阅读,而且支持各种语言的程序代码。 安装 & 激活 1. 下载 下载地址 直接点击下载即可,我下载的是 4.0 版本。 然后按照步骤安装完成即…

chatGPT给出Python time.sleep()假死(挂起)的解决办法

1. time.sleep()假死(挂起)的原因与解决办法 最近,使用chatGPT帮着写程序,完成通过API获取天气数据的程序,运行起来后出现了状况:莫名其妙的的假死(程序被挂起来,不执行了&#xff…