当前位置: 首页 > news >正文

设计循环队列 | C语言实现

以下是LeetCode原题链接:

https://leetcode.cn/problems/design-circular-queue/description/https://leetcode.cn/problems/design-circular-queue/description/

思路

因为这个队列是循环利用的,所以开辟的空间大小是固定的,那么数据的增删可以靠下标的移动来完成而非开辟/释放空间,所以用数组实现队列是较为方便的。

该题较为困难的点是,如何区分满和空的情况。

可以多开辟一个空间,即k+1个空间来区分。

循环队列里需要包含头,尾和队列的大小,尾指向的是队尾元素的下一位。

假设队列大小是3,则开辟4个空间

空的情况

满的情况

以上就是解题思路,下面开始代码实现。

实现代码

创建循环队列指针

MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));//多开辟一个空间 k+1obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = obj->rear = 0;obj->k = k;return obj;
}

因为是需要返回创建的指针,所以要在堆上开辟,防止空间销毁。

空队列判定

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

满队列判定

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

当队列情况如下时,不能用obj->rear + 1 == front来判断。

这个时候可以让obj->rear + 1再对k+1取模。

比如rear的下标是3, (3+1) % 4 == 0,front的下标就是0。

这样就可以解决这种情况。

插入数据

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

插入前要判断是否满。

 删除数据

注意:队列Push是头删

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

因为是循环队列,所以要考虑到下述情况:

每次使obj->front %= ( k + 1)即可。

返回队头

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

返回队尾

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

因为rear是队尾的下一个位置,所以返回队尾需要处理下述情况:

可以用(obj->rear - 1 + obj->k + 1) % (obj->k + 1)解决。

比如,rear是0,则 0 - 1 + 3 + 1 == 3,下标3就是队尾。

源码

typedef struct {int *a;int front;int rear;int k;
} MyCircularQueue;MyCircularQueue* myCircularQueueCreate(int k) {MyCircularQueue* obj = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));obj->a = (int*)malloc(sizeof(int)*(k+1));obj->front = obj->rear = 0;obj->k = k;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)){if (myCircularQueueIsEmpty(obj)){obj->a[obj->front] = value;}else{obj->a[obj->rear] = value;}obj->rear++;obj->rear %= obj->k + 1;return true;}elsereturn false;
}bool myCircularQueueDeQueue(MyCircularQueue* obj) {if(!myCircularQueueIsEmpty(obj)){obj->front++;obj->front %= obj->k + 1;return true;}else{return false;}
}int myCircularQueueFront(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->front + obj->k + 1) % (obj->k + 1)];
}int myCircularQueueRear(MyCircularQueue* obj) {if(myCircularQueueIsEmpty(obj))return -1;return obj->a[(obj->rear - 1 + obj->k + 1) % (obj->k + 1)];
}void myCircularQueueFree(MyCircularQueue* obj) {free(obj);
}/*** 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);
*/

http://www.dtcms.com/a/601319.html

相关文章:

  • 可以做淘宝推广的网站有哪些内容微信公众平台可以导入wordpress
  • 5.1 路由选择算法
  • 十八、文本预处理与基础技术
  • 巨 椰 云手机突破物理限制
  • java基础-继承练习
  • 寻花问柳一家专门做男人的网站1534939978姐的微信德惠市
  • 做网站的毕业设计博客网站制作
  • Java应用中,CPU 使用率过高​问题排查(手动用top+jstack或阿里Arthas)
  • k8s的包管理工具(5)--读取文件内容
  • AXI-5.4 Protocol errors
  • 动易网站后台帮人做彩票网站有事吗
  • 购物网站php模板周口市网站建设
  • 装饰公司网站模板下载建设网站的内容及实现方式
  • Kubernetes 学习笔记
  • 【自然语言处理】基于统计基的句子边界检测算法
  • 数据智能开发三 数据架构设计
  • 数据治理进阶——解读数据平台数据治理与建设方案【附全文阅读】
  • 基于OpenAI与DashScope的AI知识面试模拟系统实现
  • 嘉兴市南湖区城乡规划建设局网站做年报的网站怎么登不上去了
  • IntelliJ IDEA 2025.2.4 安装 MybatisX 不生效问题记录
  • Java 大视界 -- Java 大数据机器学习模型在自然语言生成中的可控性研究与应用实战
  • Langchain的LCEL组件
  • 南阳网站建设制作价格网站建设实践试卷
  • T型槽平台:工业制造中的多功能基础工装
  • 展示 Ansys 增材制造解决方案
  • PcVue播客系列 - E2 | 智慧制造、人工智能与工业模拟的未来 —— 对话 Andrew Siprelle
  • 广州广告网站建设图片网站源码
  • 有的app不能通过应用商城更新
  • 价格变化的效率问题
  • 仓颉三方库开发实战:sanitize_html 实现详解