用c语言实现循环队列的对外接口优雅代码
时间: 2024-02-03 13:12:00 浏览: 83
循环队列的对外接口一般包括以下函数:创建队列、销毁队列、入队、出队、获取队头元素、获取队列长度等。以下是一个基于C语言的循环队列实现的优雅代码:
```
typedef struct {
int *data; // 队列数据
int head; // 队头下标
int tail; // 队尾下标
int capacity; // 队列容量
} MyCircularQueue;
MyCircularQueue* myCircularQueueCreate(int k) {
MyCircularQueue *queue = (MyCircularQueue *)malloc(sizeof(MyCircularQueue));
queue->data = (int *)malloc(sizeof(int) * k);
queue->head = -1;
queue->tail = -1;
queue->capacity = k;
return queue;
}
bool myCircularQueueIsEmpty(MyCircularQueue* obj) {
return obj->head == -1;
}
bool myCircularQueueIsFull(MyCircularQueue* obj) {
return ((obj->tail + 1) % obj->capacity) == obj->head;
}
bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {
if (myCircularQueueIsFull(obj)) {
return false;
}
if (myCircularQueueIsEmpty(obj)) {
obj->head = 0;
}
obj->tail = (obj->tail + 1) % obj->capacity;
obj->data[obj->tail] = value;
return true;
}
bool myCircularQueueDeQueue(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return false;
}
if (obj->head == obj->tail) {
obj->head = -1;
obj->tail = -1;
return true;
}
obj->head = (obj->head + 1) % obj->capacity;
return true;
}
int myCircularQueueFront(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->data[obj->head];
}
int myCircularQueueRear(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return -1;
}
return obj->data[obj->tail];
}
int myCircularQueueGetLength(MyCircularQueue* obj) {
if (myCircularQueueIsEmpty(obj)) {
return 0;
}
return (obj->tail - obj->head + obj->capacity) % obj->capacity + 1;
}
void myCircularQueueFree(MyCircularQueue* obj) {
free(obj->data);
free(obj);
}
```
其中,MyCircularQueue为循环队列的结构体,包含队列的数据、队头下标、队尾下标和队列容量等信息。在创建队列时,需要动态分配内存,并将队头和队尾下标初始化为-1,表示队列为空。在入队函数中,需要判断队列是否已满,并在队列为空时设置队头下标。在出队函数中,需要判断队列是否为空,并在队列中只有一个元素时将队头和队尾下标重置为-1。在获取队头和队尾元素时,需要判断队列是否为空。获取队列长度时,需要特别注意循环队列中计算长度的方法。在销毁队列时,需要释放动态分配的内存。
阅读全文