首先建立头文件“qa.h”
/* 基于数组的队列实现*/
#ifndef _QA_H
#define _QA_H
#include <sys/types.h>
/* 队列 */
typedef struct Queue {
int* arr; /* 数组 */
size_t cap; /* 容量 */
size_t front; /* 前端(弹出) */
size_t rear; /* 后端(压入) */
size_t size; /* 数量 */
} QUEUE;
/* 分配内存空间并初始化为空队列 */
void queue_init (QUEUE* queue, size_t cap);
/* 释放内存空间并恢复到初始状态 */
void queue_deinit (QUEUE* queue);
/* 判断是否满 */
int queue_full (QUEUE* queue);
/* 判断是否空 */
int queue_empty (QUEUE* queue);
/* 压入 */
void queue_push (QUEUE* queue, int data);
/* 弹出 */
int queue_pop (QUEUE* queue);
/* 队首 */
int queue_front (QUEUE* queue);
/* 数量 */
size_t queue_size (QUEUE* queue);
#endif /* _QA_H */
函数实现部分“qa.c”
/* 基于数组的队列 */
#include <stdlib.h>
#include "qa.h"
/* 分配内存空间并初始化为空队列 */
void queue_init (QUEUE* queue, size_t cap) {
queue->arr = malloc (cap * sizeof (int));
queue->cap = cap;
queue->front = 0;
queue->rear = 0;
queue->size = 0;
}
/* 释放内存空间并恢复到初始状态 */
void queue_deinit (QUEUE* queue) {
free (queue->arr);
queue->arr = NULL;
queue->cap = 0;
queue->front = 0;
queue->rear = 0;
queue->size = 0;
}
/* 判断是否满 */
int queue_full (QUEUE* queue) {
return queue->size >= queue->cap;
}
/* 判断是否空 */
int queue_empty (QUEUE* queue) {
return ! queue->size;
}
/* 压入 */
void queue_push (QUEUE* queue, int data) {
if (queue->rear >= queue->cap)
queue->rear = 0;
++queue->size;
queue->arr[queue->rear++] = data;
}
/* 弹出 */
int queue_pop (QUEUE* queue) {
if (queue->front >= queue->cap)
queue->front = 0;
--queue->size;
return queue->arr[queue->front++];
}
/* 队首 */
int queue_front (QUEUE* queue) {
if (queue->front >= queue->cap)
queue->front = 0;
return queue->arr[queue->front];
}
/* 数量 */
size_t queue_size (QUEUE* queue) {
return queue->size;
}
测试用例“qa_test.c”
/* 基于数组的队列 */
#include <stdio.h>
#include "qa.h"
/* 测试用例 */
int main (void) {
QUEUE queue;
queue_init (&queue, 4);
int i;
for (i = 10; i <= 40; i += 10)
if (! queue_full (&queue))
queue_push (&queue, i);
for (i = 0; i < 2; ++i)
if (! queue_empty (&queue))
printf ("%d\n", queue_pop (&queue));
for (i = 50; i <= 60; i += 10)
if (! queue_full (&queue))
queue_push (&queue, i);
while (! queue_empty (&queue))
printf ("%d\n", queue_pop (&queue));
queue_deinit (&queue);
return 0;
}