
LeetCode:622. Design Circular Queue设计循环队列(C语言)
发布日期:2021-05-08 18:43:42
浏览次数:23
分类:精选文章
本文共 3960 字,大约阅读时间需要 13 分钟。
题目描述:
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 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 的范围内;请不要使用内置的队列库。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-circular-queue 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解答:typedef struct { int*data; //数据域 int front; //队列头 int rear; //队列尾 int size; //队列长度 int flag; //队列是否满标志} MyCircularQueue;/** Initialize your data structure here. Set the size of the queue to be k. */MyCircularQueue* myCircularQueueCreate(int k) { if(k < 0){ return NULL; } MyCircularQueue *obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue)); if(NULL == obj){ return NULL; } obj->data = (int*)malloc(sizeof(int) * k); if(NULL == obj->data){ return NULL; } obj->front = obj->rear =0; obj->size = k; obj->flag = 0; return obj;}bool myCircularQueueIsEmpty(MyCircularQueue* obj);bool myCircularQueueIsFull(MyCircularQueue* obj);/** Insert an element into the circular queue. Return true if the operation is successful. */bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { if (myCircularQueueIsFull(obj)){ //判断队列是否满 return false; } obj->data[obj->rear] = value;//插入数据 obj->rear = ((obj->rear + 1) < obj->size)?(obj->rear + 1):0;//判断是否到达数组边界,且尾指针+1 if(obj->rear == obj->front){ obj->flag = 1; } return true;}/** Delete an element from the circular queue. Return true if the operation is successful. */bool myCircularQueueDeQueue(MyCircularQueue* obj) { if (myCircularQueueIsEmpty(obj)){ //判断队列是否空 return false; } obj->data[obj->front] = 0;//清除队列头数据 obj->front = ((obj->front + 1) < obj->size)?(obj->front + 1):0;//判断是否到达数组边界,且头指针+1 obj->flag = 0;//删除元素,队列即不满 return true;}/** Get the front item from the queue. */int myCircularQueueFront(MyCircularQueue* obj) { if (myCircularQueueIsEmpty(obj)){ return -1; } return obj->data[obj->front];}/** Get the last item from the queue. */int myCircularQueueRear(MyCircularQueue* obj) { if(myCircularQueueIsEmpty(obj)){ return -1; } int i = 0; i = ((obj->rear == 0) ? (obj->size-1):(obj->rear-1)); return obj->data[i];}/** Checks whether the circular queue is empty or not. */bool myCircularQueueIsEmpty(MyCircularQueue* obj) { if(0 == obj->flag && obj->front == obj->rear){ //队列未满且首尾指针相同,则队列空 return true; } else{ return false; }}/** Checks whether the circular queue is full or not. */bool myCircularQueueIsFull(MyCircularQueue* obj) { if(1 == obj->flag){ return true; } else{ return false; } }void myCircularQueueFree(MyCircularQueue* obj) { free(obj->data); obj->data = NULL; free(obj); obj = NULL;}/** * Your MyCircularQueue struct will be instantiated and called as such: * MyCircularQueue* obj = myCircularQueueCreate(k); * bool param_1 = myCircularQueueEnQueue(obj, value); * bool param_2 = myCircularQueueDeQueue(obj); * int param_3 = myCircularQueueFront(obj); * int param_4 = myCircularQueueRear(obj); * bool param_5 = myCircularQueueIsEmpty(obj); * bool param_6 = myCircularQueueIsFull(obj); * myCircularQueueFree(obj);*/
运行结果:

发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月02日 22时56分43秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
稀疏数组
2021-05-09
js的严格模式
2021-05-09
idea的安装和无限期试用
2021-05-09
Oracle VM VirtualBox安装PVE虚拟机
2021-05-09
【转】如何用css限制文字长度,使溢出的内容用省略号…显示
2021-05-09
Android MediaPlayer setDataSource failed
2021-05-09
ASP.NET Core 实战:Linux 小白的 .NET Core 部署之路
2021-05-09
【nodejs原理&源码杂记(8)】Timer模块与基于二叉堆的定时器
2021-05-09
大前端的自动化工厂(1)——Yeoman
2021-05-09
数据仓库建模方法论
2021-05-09
虚拟机搭建hadoop环境
2021-05-09
DataStax Bulk Loader教程(四)
2021-05-09
.NET应用框架架构设计实践 - 概述
2021-05-09
Rust 内置 trait :PartialEq 和 Eq
2021-05-09
Hibernate(十四)抓取策略
2021-05-09
[菜鸟的设计模式之旅]观察者模式
2021-05-09
Spring-继承JdbcDaoSupport类后简化配置文件内容
2021-05-09
Java基础IO流(一)
2021-05-09
Hibernate入门(四)---------一级缓存
2021-05-09