当前位置:网站首页>LeetCode·每日一题·
LeetCode·每日一题·
2022-08-02 16:40:00 【小迅想变强】
链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
题目
示例
思路
模拟构造法
循型队列应该是非常基础并且重要的数据结构,循环队列的一个好处是我们可以利用这个队列之前用过的空间。
对于队列有两种基本实现结构
- 用数组实现的队列->也称顺序队列
- 用链表实现的队列->也陈链式队列
对于循环队列自然也可以用数组或者链表实现,循环队列其实本质上和普通队列没有什么区别,只是在普通队列的基础之上加了取余操作,使之在逻辑在形成了循环,然而本质上还是一个普通队列。
用数组和链表都一样,构造普通队列,在插入和删除操作时+取余操作,使之在逻辑上循环
对于数组实现
typedef struct {
int * queue;//普通队列数组实现
int front;//对头
int rear;//对尾
int size;//队列大小
int logo;//当前元素个数
} MyCircularQueue;
可以定义当前元素个数,也可以在定义队列大小时+1,用front与rear判断队列是否满
- front == rear 队列为空
- (rear+1) % size = front 队列为满
代码
数组实现
typedef struct {
int * queue;//普通队列数组实现
int front;//对头
int rear;//对尾
int size;//队列大小
int logo;//当前元素个数
} MyCircularQueue;
//MyCircularQueue(k): 构造器,设置队列长度为 k 。
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue * obj = malloc(sizeof(MyCircularQueue));
obj->queue = malloc(sizeof(int) * k);
obj->size = k;
obj->front = 0;
obj->rear = 0;
obj->logo = 0;
return obj;
}
//enQueue(value):向循环队列插入一个元素。如果成功插入则返回真。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if(obj->logo == obj->size)
{
return false;
}
obj->queue[(obj->rear)%(obj->size)] = value;
obj->logo++;
obj->rear++;
return true;
}
//deQueue(): 从循环队列中删除一个元素。如果成功删除则返回真。
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if(obj->logo == 0)
{
return false;
}
obj->logo--;
obj->front++;
obj->front %= obj->size;
return true;
}
//Front: 从队首获取元素。如果队列为空,返回 -1 。
int myCircularQueueFront(MyCircularQueue* obj) {
if(obj->logo == 0)
{
return -1;
}
return obj->queue[obj->front];
}
//Rear: 获取队尾元素。如果队列为空,返回 -1 。
int myCircularQueueRear(MyCircularQueue* obj) {
if(obj->logo == 0)
{
return -1;
}
return obj->queue[(obj->rear-1) % obj->size];
}
//isEmpty(): 检查循环队列是否为空。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
if(obj->logo == 0)
{
return true;
}
return false;
}
//isFull(): 检查循环队列是否已满。
bool myCircularQueueIsFull(MyCircularQueue* obj) {
if(obj->logo == obj->size)
{
return true;
}
return false;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->queue);
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);
*/
作者:xun-ge-v
链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
链表实现
typedef struct {
struct ListNode *head;
struct ListNode *tail;
int capacity;
int size;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
obj->capacity = k;
obj->size = 0;
obj->head = obj->tail = NULL;
return obj;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (obj->size >= obj->capacity) {
return false;
}
struct ListNode *node = (struct ListNode *)malloc(sizeof(struct ListNode));
node->val = value;
node->next = NULL;
if (!obj->head) {
obj->head = obj->tail = node;
} else {
obj->tail->next = node;
obj->tail = node;
}
obj->size++;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (obj->size == 0) {
return false;
}
struct ListNode *node = obj->head;
obj->head = obj->head->next;
obj->size--;
free(node);
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if (obj->size == 0) {
return -1;
}
return obj->head->val;
}
int myCircularQueueRear(MyCircularQueue* obj) {
if (obj->size == 0) {
return -1;
}
return obj->tail->val;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->size == 0;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return obj->size == obj->capacity;
}
void myCircularQueueFree(MyCircularQueue* obj) {
for (struct ListNode *curr = obj->head; curr;) {
struct ListNode *node = curr;
curr = curr->next;
free(node);
}
free(obj);
}
作者:xun-ge-v
链接:https://leetcode.cn/problems/design-circular-queue/solution/by-xun-ge-v-lu8a/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
边栏推荐
- Navicat for mysql破解版安装
- 实时数仓架构演进及选型
- julia系列1:介绍与安装
- 什么是APS系统?导入APS要注意什么?值得反复观看
- Redis进阶之路:深度解析Redis单线程架构,图文并茂不能再清晰了
- Informatica旗下PowerCenter的元数据库解析
- 数字孪生园区场景中的坐标知识
- When Oracle analyzes the archive log content, it finds many nulls?
- 【Redis】连接报错:Could not connect to Redis at 127.0.0.1:6379: Connection refused
- julia系列5:文本、图像、其他语言函数互动
猜你喜欢
随机推荐
编写一个油猴脚本
Arduino 硬件编程语言基础学习入门
A tour of gRPC: 06 - gRPC client straming
MySQL——慢查询日志分析
Mysql——分组统计
蔚来杯2022牛客暑期多校训练营5 ABCDFGHK
小心 transmittable-thread-local 的这个坑
小程序实现手写左右翻页和动态修改横向滚动条位置
Summary of CNN classic models [easy to understand]
29. 两数相除
Navicat premium download and install 15 detailed tutorial
Nacos的基本配置
什么是APS系统?导入APS要注意什么?值得反复观看
链表的归并排序[自顶向下分治 || 自低向上合并]
One article to understand DI dependency injection in php
研发了 5 年的时序数据库,到底要解决什么问题?
时间戳格式化「建议收藏」
[LeetCode]剑指 Offer 55 - I. 二叉树的深度
【二】通过props进行传值,子页面多种方式接收
MySQL常见面试题汇总(建议收藏!!!)