循环队列我是基于动态数组的优化实现的
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define DEFAULT_CAPACITY 10
#define ELEMENT_NOT_FOUND -1
// 我们的循环队列是基于队列实现的 所以说只能够在队尾入队 队头出队 而且这次循环队列我们就要基于数组实现了 而不是队列的基于实现--双向链表
int size;// 数组元素个数
int front;// 首元素的位置标识
// 初始化一个循环队列
int* initCircleQueue(int capacity) {
// 首先设置好容量
capacity = capacity < DEFAULT_CAPACITY ? DEFAULT_CAPACITY : capacity;
int* array = (int*)malloc(sizeof(int) * capacity);
return array;
}
// 队尾入队
void enQueue(int data, int* array, int capacity) {
// 由于队尾入队可能会导致队尾无法容纳指定元素 所以得得往队头继续进行添加操作 所以需要使用取模运算符
// 获取数组容量
int length = capacity;
array[(front + size) % length] = data;
// 更新队列长度
size++;
}
// 队头出队
int deQueue(int* array, int capacity) {
// 对队列进行判空操作
if (size == 0)return -1;
// 由于队头出队会导致队头元素更新 而队头元素很有可能从队尾移动到队头 所以说我们需要进行取模运算才行
// 获取数组长度
int length = capacity;
int data = array[front];
front = (front + 1) % length;
// 更新队列长度
size--;
return data;
}
// 获取队头元素
int get(int* array) {
// 对队列进行判空操作
if (size == 0)return -1;
return array[front];
}
// 对队列执行清空操作
void clear(int* array) {
size = 0;
front = 0;
}
// 获取队列长度
int getSize() {
return size;
}
// 打印函数
void printCircleQueue(int* array, int capacity) {
int length = capacity;
for (int i = front; i < (front + size) % length; ++i) {
printf("%d ", array[i]);
}
printf("\n");
}
int getLength(int* array) {
int count = 0;
while (array[count]) {
count++;
}
return count;
}
// 定义一个主函数
int main() {
int* circleQueue = initCircleQueue(8);
int capacity = getLength(circleQueue);
enQueue(1, circleQueue, capacity);
enQueue(2, circleQueue, capacity);
enQueue(3, circleQueue, capacity);
printCircleQueue(circleQueue, capacity);// 1 2 3
deQueue(circleQueue, capacity);// 2 3
printCircleQueue(circleQueue, capacity);// 2 3
printf("%d\n", get(circleQueue));// 2
clear(circleQueue);
printf("%d\n", getSize());// 0
printf("%d\n", front);// 0
}