链接: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判断队列是否满
数组实现
- 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)
- 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。