环形队列在实现消息的缓存、异步操作、生产者消费者等方面应用广泛,现给出实例以供参考:
#define QUEUE_MAX 8 // 循环队列容量
typedef int QDataType;
typedef struct {
QDataType data[QUEUE_MAX];
int front; // 队首
int tail; // 队尾
} Queue;
// 初始化
void QueueInit(Queue *pq)
{
if (pq == NULL) {
return;
}
pq->front = 0;
pq->tail = 0;
}
// 判断队列是否已满
bool IsFullQueue(Queue *pq)
{
return (((pq->tail + 1) % QUEUE_MAX) == pq->front);
}
// 判断队列是否为空
bool IsEmptyQueue(Queue *pq)
{
return (pq->front == pq->tail);
}
// 获取队列中元素使用个数
int QueueUsedSize(Queue *pq)
{
if (pq == NULL) {
return 0;
}
return ((pq->tail + QUEUE_MAX - pq->front) % QUEUE_MAX);
}
// 获取队列中元素空闲个数
int QueueFreeSize(Queue *pq)
{
if (pq == NULL) {
return 0;
}
return ((pq->front + QUEUE_MAX - pq->tail) % QUEUE_MAX);
}
// 入队
void QueuePush(Queue *pq, QDataType x)
{
if (pq == NULL) {
return;
}
if (IsFullQueue(pq)) {
return;
}
pq->data[pq->tail] = x;
pq->tail = (pq->tail + 1) % QUEUE_MAX;
}
// 出队
void QueuePop(Queue *pq, int *val)
{
if (IsEmptyQueue(pq) || val == NULL) {
return;
}
*val = pq->data[pq->front];
pq->front = (pq->front + 1) % QUEUE_MAX;
}
// 获取队首元素
QDataType QueueFront(Queue *pq)
{
if (pq == NULL) {
return;
}
if (IsEmptyQueue(pq)) {
return 0;
}
return pq->data[pq->front];
}