. 一、环形队列的优势
环形队列是一种特殊的队列,它可以解决普通队列在使用时空间利用不充分的问题。在环形队列中,当队列满时,队列的尾指针指向队列的起始位置,而不是指向队列的最后一个元素。这样可以在不浪费空间的情况下存储更多的元素。
下面我们来详细讲解一下环形队列的实现。
. 二、环形队列的定义
首先,我们需要定义一个环形队列的结构体,包含以下成员变量:
-
int *queue:指向环形队列的指针;
-
int front:指向队列的头部;
-
int rear:指向队列的尾部;
-
int size:队列的容量。
typedef struct {
int *queue;
int front;
int rear;
int size;
} MyCircularQueue;
三、环形队列的初始化
在初始化环形队列时,我们需要为其动态分配内存空间,并将头指针和尾指针都初始化为-1,表示队列为空。
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue *obj = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
obj->queue = (int *)malloc(sizeof(int) * k);
obj->front = -1;
obj->rear = -1;
obj->size = k;
return obj;
}
. 四、环形队列的入队
当向队列中插入元素时,我们需要先判断队列是否已满。如果队列已满,则插入失败,返回false;否则,将元素插入到队列的尾部,并将尾指针指向下一个位置。
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (myCircularQueueIsFull(obj)) {
return false;
}
obj->rear = (obj->rear + 1) % obj->size;
obj->queue[obj->rear] = value;
if (obj->front == -1) {
obj->front = obj->rear;
}
return true;
}
. 五、环形队列的出队
当从队列中删除元素时,我们需要先判断队列是否为空。如果队列为空,则删除失败,返回false;否则,将元素从队列的头部删除,并将头指针指向下一个位置。
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return false;
}
if (obj->front == obj->rear) {
obj->front = -1;
obj->rear = -1;
return true;
}
obj->front = (obj->front + 1) % obj->size;
return true;
}
. 六、环形队列的查看队首元素
当查看队列的头部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则返回队列头部的元素。
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->queue[obj->front];
}
. 七、环形队列的查看队尾元素
当查看队列的尾部元素时,我们需要先判断队列是否为空。如果队列为空,则返回-1;否则,返回队列尾部的元素。
int myCircularQueueRear(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->queue[obj->rear];
}
. 八、环形队列的判断是否为空
当判断队列是否为空时,只需要判断头指针是否为-1即可。
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->front == -1;
}
. 九、环形队列的判断是否已满
当判断队列是否已满时,只需要判断尾指针下一个位置是否为头指针即可。
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return (obj->rear + 1) % obj->size == obj->front;
}
. 十、环形队列的销毁
当环形队列不再使用时,需要释放其占用的内存空间。
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->queue);
free(obj);
}
总的来说,环形队列是一种非常实用的数据结构,特别适用于空间有限的情况下。通过合理的设计和实现,可以使得队列的空间利用率更高,并且操作效率也比较高。
标签:return,队列,环形,C语言,int,front,obj
From: https://www.cnblogs.com/rongjiangwei/p/17392767.html