循环队列是一种可以循环使用的队列,它可以在数组的固定大小上实现队列的功能。在循环队列中,队列的尾部和头部都可以是任何一个空闲位置,从而充分利用数组空间。
下面给出从队尾出队元素的算法:
// 循环队列结构体定义
typedef struct {
int *data; // 存储数据的数组
int front; // 头指针,指向队头元素的下标
int rear; // 尾指针,指向队尾元素的下一个位置
int capacity; // 队列的容量
} MyCircularQueue;
// 从队尾出队元素函数定义
int myCircularQueueDequeue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) return -1; // 判断队列是否为空
int val = obj->data[obj->rear - 1]; // 取出队尾元素
obj->rear = (obj->rear - 1 + obj->capacity) % obj->capacity; // 修改队尾指针
return val;
}
在循环队列中,从队尾出队元素,实际上就是将队尾指针rear向前移动一位(如果当前队列为空,则直接返回-1),然后取出队尾元素,最后返回该元素即可。
需要注意的是,由于队列是循环的,因此我们需要使用取模运算保证队列指针前进时始终在数组索引范围内。
下面是更详细的代码实现。
循环队列的结构体定义如下:
typedef struct {
int *data; // 存储数据的数组
int front; // 头指针,指向队头元素的下标
int rear; // 尾指针,指向队尾元素的下一个位置
int capacity; // 队列的容量
} MyCircularQueue;
使用动态分配内存的话,可以在创建队列的函数中进行分配,如下:
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue* queue = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
queue->data = (int*)malloc(sizeof(int) * k);
queue->front = 0;
queue->rear = 0;
queue->capacity = k;
return