以下是实现的函数,经过测试没有发现什么问题,欢迎留言讨论
typedef struct { //创建队列
int* array;
int front;
int rear;
int count;
int N;
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) { //构造长度为k的队列
MyCircularQueue* q = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
if (q == NULL) {
return NULL;
}
q->array = (int*)malloc(sizeof(int) * k);
if (q->array == NULL) {
free(q);
return NULL;
}
q->front = 0;
q->rear = 0;
q->count = 0;
q->N = k;
return q;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) { //判断队列是否为空
return obj->count == 0;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) { //判断队列是否满了
return obj->count == obj->N;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) { //插入元素
assert(obj);
if (myCircularQueueIsFull(obj)) {
return false;
}
obj->array[obj->rear] = value;
obj->rear++;
if (obj->rear == obj->N) {
obj->rear = 0;
}
obj->count++;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) { //删除元素
assert(obj);
if (myCircularQueueIsEmpty(obj)) {
return false;
}
obj->front++;
if (obj->front == obj->N) {
obj->front = 0;
}
obj->count--;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) { //获取首元素
assert(obj);
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->array[obj->front];
}
int myCircularQueueRear(MyCircularQueue* obj) { //获取尾元素
assert(obj);
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
int rear = (obj->rear - 1 + obj->N) % obj->N;
return obj->array[rear];
}
void myCircularQueueFree(MyCircularQueue* obj) { //free队列
if (obj) {
if (obj->array) {
free(obj->array);
}
free(obj);
}
}