C语言中链表经典面试题目——设计循环队列

news/2024/12/22 8:51:32/

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++,数据结构

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

设计循环队列


设计循环队列

难度:中等

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

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

你的实现应该支持如下操作:

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

示例:

MyCircularQueue circularQueue = new MyCircularQueue(3); // 设置长度为 3
circularQueue.enQueue(1);  // 返回 true
circularQueue.enQueue(2);  // 返回 true
circularQueue.enQueue(3);  // 返回 true
circularQueue.enQueue(4);  // 返回 false,队列已满
circularQueue.Rear();  // 返回 3
circularQueue.isFull();  // 返回 true
circularQueue.deQueue();  // 返回 true
circularQueue.enQueue(4);  // 返回 true
circularQueue.Rear();  // 返回 4

提示:

  • 所有的值都在 0 至 1000 的范围内;
  • 操作数将在 1 至 1000 的范围内;
  • 请不要使用内置的队列库。

解题思路:

循环队列这里采用动态数组的形式实现的(动态开辟空间的数组),队列具有先进先出的原则,所以我需要两个下标标记,一个头标记front,一个尾标记rear。我们如果存储k个数据的话,我们需要动态开辟k+1个空间才能有序存储k个数据。具体实现如下:

循环队列的创建

front和rear的初始值都为0.

MyCircularQueue* myCircularQueueCreate(int k) 
{MyCircularQueue* obj=(MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a=(int*)malloc(sizeof(int)*(k+1));obj->k=k;obj->front=obj->rear=0;return obj;
}

循环队列的判空

只要front和rear的值相等,就说明队列已经为空,并返回真值

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

循环对列的判满

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

循环队列插入一个元素

首先插入元素时需要判断队列是否已经满了,如果满了就不能插入元素,返回假值。如果没有,就在下表标尾rear的位置插入元素,并且rear++,如果rear的值大于等于k+1则需要将rear对k+1进行取模,让rear的值在0~k之间。

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

循环队列中删除一个元素

首先删除元素时需要判断队列是否为空,如果为空就不能删除元素,返回假值。如果没有,就让front++,如果front的值大于等于k+1则需要将front对k+1进行取模,让front的值在0~k之间。

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

队首获取元素

首先返回队首元素时需要判断队列是否为空,如果为空就不能返回队首元素,返回假值。如果没有,返回下标为front的值。

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

获取队尾元素

首先返回队尾元素时需要判断队列是否为空,如果为空就不能返回队尾元素,返回假值。如果没有,先判断rear的是否为0,如果为0,则需要rear+k并返回下标尾rear+k的值。如果不为0,则需要rear-1并返回下标为rear-1的值。

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

循环队列的销毁

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

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   


http://www.ppmy.cn/news/75274.html

相关文章

【Unity】UGUI基础控件的使用介绍

UGUI基础控件的使用 一、基本介绍二、UI控件介绍1. Text(文本)2. Image(图片)3. Button(按钮)4. Input Field(输入框)5. Toggle(开关)6. Slider(滑动条)7. ScrollBar(滚动条)8. DropDown(下拉列表)9. Panel(面板)10. ScrollRect(滚动视图)一、基本介绍 Un…

Chatbot UI老外在用的gpt网页版 搭建方法分享!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT资源 Chatbot UI 高仿ChatGPT官网,中文还支持贼好,界面美观度间距还需要打磨。是老外做的吗? ​ 环境部署 更新环境 apt update -y && apt upg…

SpringCloud学习-实用篇04

以下内容的代码可见:SpringCloud_learn/day04 1.初始MQ 同步通讯和异步通讯 微服务间通讯有同步和异步两种方式,同步通讯就像打电话需要实时响应,异步通讯就像发邮件不需要马上回复。两种方式各有优劣,比如打电话能立即得到响应&a…

Kali-linux分析密码

在实现密码破解之前,介绍一下如何分析密码。分析密码的目的是,通过从目标系统、组织中收集信息来获得一个较小的密码字典。本节将介绍使用Ettercap工具或MSFCONSOLE来分析密码。 8.2.1 Ettercap工具 Ettercap是Linux下一个强大的欺骗工具,也…

08 集合框架1

什么是数据结构? 存储数据,组织数据的方法,就是对数据做增删改查的操作 常见的数据结构有哪些?各自的优缺点是什么? 数组:擅长修改 查找操作,不擅长增加 删除操作 链表:有单项链表和双向链表,擅长增加和删除操作,不擅长修改和查找的操作 队列:擅长操作头和尾,先进先出,…

LeetCode94. 二叉树的中序遍历(递归与非递归)

写在前面: 题目链接:添加链接描述 编程语言:c 题目难度:简单 一、题目描述 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2:…

使用Amazon EC2实例部署三个项目

在部署这三个项目时,以下是一种可能的思路: 1. **配置服务器环境:**确保你的服务器已经安装了适当的操作系统(例如Linux)和所需的软件(如Python、Node.js等)。 2. **设置域名和端口:…

【图论】想越狱的小衫

题目描述 这次小杉来到了经典美剧《越狱》的场景里……他被抓起来了(-.-干嘛幻想这么郁闷的场景……)。 小杉身为新一代的Scofield,在挖了半个月之后终于挖通牢房里的地道。 在地道里,无数的管道路线困惑了他。 小杉看了看自己…