⭐️ 题目描述
🌟 leetcode链接:设计循环队列
1️⃣ 思路与图解:
首先循环队列是一个固定长度的队列,如果用链表的实现的话,当队列需要取队尾的数据,则需要遍历找到尾的前一个,所以循环队列比较优的方案是用数组来实现。 又引出的问题是,如果当数据为空那么 head
指针和 tail
都应该在 0
下标处,那当数据满了 tail
和 head
指针也指向同一个下标。此时我们就不方便区分循环队列是满还是空,所以我们开辟 k + 1
个空间的大小,这样的话,当为空的时候 head == tail
,当满的时候 tail + 1 == head
,我们多开辟一个数据大小的空间来解决这里的问题。
文章来源:https://www.toymoban.com/news/detail-549984.html
代码:
文章来源地址https://www.toymoban.com/news/detail-549984.html
typedef struct {
int * data;
int k;
int head;
int tail
} MyCircularQueue;
// 函数声明
bool myCircularQueueIsEmpty(MyCircularQueue* obj);
bool myCircularQueueIsFull(MyCircularQueue* obj);
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* cq = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
// 开辟k + 1个空间 方便判断循环队列是否满或空
cq->data = (int*)malloc(sizeof(int) * (k + 1));
cq->k = k;
cq->head = 0;
cq->tail = 0;
return cq;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
// 如果循环队列已满 则插入失败
if (myCircularQueueIsFull(obj))
return false;
// 插入
obj->data[obj->tail] = value;
// 检查边界
if (++obj->tail == obj->k + 1) {
obj->tail = 0;
}
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
// 如果队列为空 删除失败
if (myCircularQueueIsEmpty(obj))
return false;
// 检查边界
if (++obj->head == obj->k + 1) {
obj->head = 0;
}
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
// 如果队列为空 取数据失败
if (myCircularQueueIsEmpty(obj))
return -1;
return obj->data[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj) {
// 如果队列为空 取数据失败
if (myCircularQueueIsEmpty(obj))
return -1;
int res = obj->tail - 1 == -1 ? obj->k : obj->tail - 1;
return obj->data[res];
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head == obj->tail;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
// 判断边界
int res = obj->tail + 1 == obj->k + 1 ? 0 : obj->tail + 1;
return res == obj->head;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->data);
free(obj);
}
到了这里,关于leetcode 622.设计循环队列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!