/*
* 循环队列实现,不浪费一个空间
*/
#include <stdio.h>
#include <stdlib.h>
typedef struct LoopQueue
{
int *data;
int front;
int tail;
int size;
int capacity;
} *LoopQueue; // struct LoopQueue* -> LoopQueue
// 初始化
LoopQueue initiation(int capacity)
{
LoopQueue queue = (LoopQueue) malloc(sizeof (struct LoopQueue));
queue->data = (int *) malloc(sizeof (int) * capacity);
queue->capacity = capacity;
queue->front = 0;
queue->tail = 0;
queue->size = 0;
if (queue == NULL || queue->data == NULL)
{
perror("LoopQueue initiation failed");
exit(-1);
}
return queue;
}
// 获取容量
int getCapacity(LoopQueue q)
{
return q->capacity;
}
// 获取元素个数
int getSize(LoopQueue q)
{
return q->size;
}
// 判断队列是否空
int isEmpty(LoopQueue q)
{
return q->size == 0;
}
// 扩容/缩容
void resize(int newCapacity, LoopQueue q)
{
int *newData = (int *) malloc(newCapacity * sizeof (int));
for (int i = 0; i < q->size; i++)
{
newData[i] = q->data[(q->front + i) % q->capacity];
}
free(q->data);
q->data = newData;
q->capacity = newCapacity;
q->front = 0;
q->tail = q->size;
}
// 入队
void enqueue(int e, LoopQueue q)
{
if (q->size == q->capacity)
{
resize(2 * q->capacity, q);
}
q->data[q->tail] = e;
q->tail = (q->tail + 1) % q->capacity;
q->size++;
}
// 出队
int dequeue(LoopQueue q)
{
if (isEmpty(q))
{
perror("Dequeue failed, queue is empty now");
return -1;
}
int ret = q->data[q->front];
q->front = (q->front + 1) % q->capacity;
q->size--;
if (q->size == q->capacity / 4 && q->capacity / 2 != 0)
{
resize(q->capacity / 2, q);
}
return ret;
}
// 获取队首
int getFront(LoopQueue q)
{
if (isEmpty(q))
{
perror("GetFront failed, queue is empty now");
return -1;
}
return q->data[q->front];
}
// 打印队列
void toString(LoopQueue q)
{
printf("LoopQueue: size = %d, capacity = %d\n", q->size, q->capacity);
printf("front [");
for (int i = 0; i < q->size; i++)
{
printf("%d", q->data[(q->front + i) % q->capacity]);
if (i != q->size - 1)
{
printf(", ");
}
}
printf("] tail\n");
}
// 销毁队列
void destroy(LoopQueue q) {
free(q->data);
q->data = NULL;
if (q->data == NULL)
{
free(q);
q = NULL;
if (q == NULL)
{
printf("The loopQueue has successfully been destroyed.\n");
}
else
{
perror("LoopQueue destroy failed");
exit(-1);
}
}
else
{
perror("LoopQueue destroy failed");
exit(-1);
}
}
int main()
{
LoopQueue q = initiation(10);
for (int i = 0; i < 10; i++)
{
enqueue(i, q);
toString(q);
if (i % 3 == 2)
{
dequeue(q);
toString(q);
}
}
destroy(q);
}
C语言循环队列
于 2022-10-20 14:08:32 首次发布