#include <stdio.h>
#include <stdlib.h>
// 定义循环队列结构体
typedef struct CircularQueue {
int *data;
int front;
int rear;
int capacity;
} CircularQueue;
// 初始化循环队列
CircularQueue* circularQueueCreate(int k) {
CircularQueue *cq = (CircularQueue*)malloc(sizeof(CircularQueue));
cq->data = (int*)malloc(k * sizeof(int));
cq->front = 0;
cq->rear = 0;
cq->capacity = k;
return cq;
}
// 判断循环队列是否已满
int circularQueueIsFull(CircularQueue* obj) {
return (obj->rear + 1) % obj->capacity == obj->front;
}
// 判断循环队列是否为空
int circularQueueIsEmpty(CircularQueue* obj) {
return obj->front == obj->rear;
}
// 入队操作
int circularQueueEnQueue(CircularQueue* obj, int value) {
if (circularQueueIsFull(obj)) {
return 0;
}
obj->data[obj->rear] = value;
obj->rear = (obj->rear + 1) % obj->capacity;
return 1;
}
// 出队操作
int circularQueueDeQueue(CircularQueue* obj) {
if (circularQueueIsEmpty(obj)) {
return 0;
}
obj->front = (obj->front + 1) % obj->capacity;
return 1;
}
// 获取队首元素
int circularQueueFront(CircularQueue* obj) {
if (circularQueueIsEmpty(obj)) {
return -1;
}
return obj->data[obj->front];
}
// 获取队尾元素
int circularQueueRear(CircularQueue* obj) {
if (circularQueueIsEmpty(obj)) {
return -1;
}
return obj->data[(obj->rear - 1 + obj->capacity) % obj->capacity];
}
// 释放循环队列内存
void circularQueueFree(CircularQueue* obj) {
free(obj->data);
free(obj);
}
循环队列相较于普通队列的优势:
- 空间利用率更高:普通队列在元素出队后,前面的空间无法再次利用,可能导致空间浪费。而循环队列可以重复利用这些空间,当队尾指针到达数组末尾时,可以回到数组开头继续使用空间,只要数组还有空闲位置就可以继续入队。
- 避免假溢出:普通队列可能会出现假溢出的情况,即队尾指针已经到数组末尾,但数组前面还有空闲位置,却无法再进行入队操作。循环队列通过循环利用数组空间,有效避免了这种假溢出问题。