手把手教你实现一个循环队列(C语言)

这篇具有很好参考价值的文章主要介绍了手把手教你实现一个循环队列(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

这是一道leetcode关于队列的经典题:

622. 设计循环队列https://leetcode.cn/problems/design-circular-queue/手把手教你实现一个循环队列(C语言),题目,数据结构,c语言,开发语言,leetcode,链表,数据结构

思路: 

 大家注意这个题目要求,这个队列是定长的,如果满了则不能再添加数据。那么我们设计一个队头front和队尾rear,每次添加数据rear向后走,这时就有一个问题,怎么区分空和满呢?当最后一个数据入队列之后,由于这是个循环队列,rear会回到front这个位置。那么比较好的一种方法就是多开一个空间,满的条件是rear+1==front

手把手教你实现一个循环队列(C语言),题目,数据结构,c语言,开发语言,leetcode,链表,数据结构

 手把手教你实现一个循环队列(C语言),题目,数据结构,c语言,开发语言,leetcode,链表,数据结构

实现:

循环队列的定义:

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

循环队列的创建:

为队列和数组创建空间,需要注意的是数组a的空间是K+1个,要多开一个.

MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多开辟一个空间,用以区分空和满
    obj->K=k;
    obj->a=(int*)malloc(sizeof(int)*(obj->K+1));
    obj->front=0;
    obj->rear=0;
    return obj;
}

判断队列是否为空:

如果front==rear则为空。

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

判断队列是否为满:

如果rear+1==front则为满,或者说(rear+1)%(k+1)==front。

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

 数据入队列:

先判断队列是否满了,满了则返回false。如果不满则在rear这个位置上添加数据,再把rear++,再将rear=rear%(k+1)。

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->rear]=value;
    obj->rear++;

    obj->rear=(obj->rear)%(obj->K+1);
    return true;
}

数据出队列:

判断一下队列是否为空,空则返回false。出队列直接将front++即可,再将front=front%(k+)。

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    obj->front++;
    obj->front=(obj->front)%(obj->K+1);
    return true;
}

取队列头部数据:

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

取队列尾部数据:

这里需要注意,尾部数据的位置是在rear-1这个位置,所以rear-1+k+1就是rear+k.

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

销毁队列:

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

完整代码:

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


MyCircularQueue* myCircularQueueCreate(int k) {
    MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));
    //多开辟一个空间,用以区分空和满
    obj->K=k;
    obj->a=(int*)malloc(sizeof(int)*(obj->K+1));
    obj->front=0;
    obj->rear=0;
    return obj;
}

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

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

bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
    if(myCircularQueueIsFull(obj))
        return false;
    obj->a[obj->rear]=value;
    obj->rear++;

    obj->rear=(obj->rear)%(obj->K+1);
    return true;
}

bool myCircularQueueDeQueue(MyCircularQueue* obj) {
    if(myCircularQueueIsEmpty(obj))
        return false;
    obj->front++;
    obj->front=(obj->front)%(obj->K+1);
    return true;
}

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

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

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

这次的分享到这里就结束了,感谢大家的阅读!文章来源地址https://www.toymoban.com/news/detail-758989.html

到了这里,关于手把手教你实现一个循环队列(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 用HTML语言制作一个非常浪漫的生日祝福网,手把手教你制作炫酷生日祝福网页

    明天就是女朋友的生日了, 是时候展现专属于程序员的浪漫了!你打算怎么给心爱的人表达爱意?鲜花礼物?代码表白?还是创意DIY?或者…无论那种形式,快来秀我们一脸吧! HTML生日祝福网页制作(粉色主题)程序员专属生日表白网站 💬 注:以下代码为部分演示,如需完整

    2024年02月16日
    浏览(38)
  • 【数据结构】—手把手带你用C语言实现栈和队列(超详细!)

                                       食用指南:本文在有C基础的情况下食用更佳                                     🔥 这就不得不推荐此专栏了:C语言                                   ♈️ 今日夜电波:Tell me —milet                    

    2024年02月14日
    浏览(36)
  • 手把手教你针对层级时间轮(TimingWheel)延时队列的实战落地

    承接上文 承接上文,让我们基本上已经知道了「时间轮算法」原理和核心算法机制,接下来我们需要面向于实战开发以及落地角度进行分析如何实现时间轮的算法机制体系。 前言回顾 什么是时间轮 调度模型:时间轮是为解决高效调度任务而产生的调度模型/算法思想。 数据

    2023年04月20日
    浏览(32)
  • 数据结构之栈和队列 - 超详细的教程,手把手教你认识并运用栈和队列

    栈:后进先出 队列:先进先出 栈:是一种特殊的 线性表 , 只允许在固定的一端插入或者删除元素 ,一个栈包含了栈顶和栈底。只能在栈顶插入或者删除元素。 栈的底层 是由 数组 实现的。 栈遵循先入后出原则,也就是先插入的元素得到后面才能删除,后面插入的元素比

    2024年02月07日
    浏览(43)
  • 手把手教你做一个多路灰度传感器

    市面上有的灰度传感器对于一些人来说可能不合适  于是呢不少人想自己做,比如我,当时也是走了一些弯路的,现在把自己的经验写上来,各位动手能力强的自己拿去用 原理: 左边发射红外光,地面反射到光敏三极管,改变A_OUTx处的电压值,不同颜色和材质对反射回来的

    2024年02月15日
    浏览(40)
  • 手把手教你搭建一个Minecraft 服务器

    这次,我们教大家如何搭建一个我的世界服务器 首先,我们来到这个网站 MCVersions.net - Minecraft Versions Download List MCVersions.net offers an archive of Minecraft Client and Server jars to download, for both current and old releases! https://mcversions.net/   在这里,我们点击对应的版本,从左到右依次是稳定版

    2024年02月09日
    浏览(34)
  • 手把手教你用MindSpore训练一个AI模型!

    首先我们要先了解深度学习的概念和AI计算框架的角色( https://zhuanlan.zhihu.com/p/463019160 ),本篇文章将演示怎么利用MindSpore来训练一个AI模型。和上一章的场景一致,我们要训练的模型是用来对手写数字图片进行分类的LeNet5模型 请参考( http://yann.lecun.com/exdb/lenet/ )。 图1 M

    2024年02月04日
    浏览(37)
  • 【手把手教你制作一个简易版的shell】

    为了简便,命令行中的提示符我们可以直接用printf打印,而具体执行命令可以交给子进程去做,现在的关键是如何将获得的命令行中的命令切割。我们在学习C语言时提到了strtok函数,正好这个函数可以用来作为切割。 基本框架: 不知道大家注意到了没有,我们从键盘中读取

    2023年04月16日
    浏览(37)
  • 【C语言】手把手教你文件操作

    程序运行时,数据存放在内存中,而当程序退出后,数据也就不复存在。 想做到数据持久化,我们可以把数据存放在硬盘,或者放到数据库里。而在C语言中,利用文件操作,就可以将数据存放在硬盘上。 读写之前应该先打开文件,使用结束之后要关闭文件。 fopen 函数用于打

    2024年02月05日
    浏览(28)
  • 手把手教你新建一个winform项目(史上最全)

    最近有粉丝订阅了我的博客专栏《winform控件从入门到精通》,但是却来问我平时使用什么软件来开发winform程序,我本以为订阅我专栏的粉丝至少应该是掌握Microsoft Visual Studio的基本用法,也能够创建winform项目,看来是我大意了,我的错,粉丝们!对于不会创建winform项目但是

    2024年02月04日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包