当前位置:网站首页>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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
边栏推荐
- Nacos环境隔离
- 尚硅谷尚品项目汇笔记(三)
- navicat creates a connection 2002-can't connect to server on localhost (10061) and the mysql service has started the problem
- Mysql开启binlog
- Navicat premium download and install 15 detailed tutorial
- Locking and concurrency control (a)
- Inconsistency between oracle and mysql statement results
- 低光数据集
- 内网渗透之kerberos认证(三)
- Oracle 11 g rac finished patch, dbca new patches of SQL database also needs to perform?
猜你喜欢
随机推荐
Default username and password (SQL)
Mysql——字符串函数
Nacos面试题
关于我用iVX沉浸式体验了一把0代码项目创建
红蓝对抗经验分享:CS免杀姿势
Gartner released, annual Challenger!
Gartner发布,年度Challenger!
排查生产环境:MySQLTransactionRollbackException数据库死锁
npm install 编译时报“Cannot read properties of null (reading ‘pickAlgorithm‘)“
Oracle 11g rac打完补丁,dbca新建数据库还需要执行应用补丁的sql吗?
【二】TS基本类型
[LeetCode]剑指 Offer 32 - II. 从上到下打印二叉树 II
锁定和并发控制(三)
双指针法 | leecode刷题笔记
Numpy those things
总结:不同语言比较总结
领导无线边缘AI的联合神经形态学习,具有较高的识别精度以及较低的能耗
QACTION_QA百科
【C语言刷题】指针入门三题|字符串长度、字符串复制、两数交换
开始使用 NVIDIA Jetson Orin 上的深度学习加速器