基于数组的队列实现

来源:互联网 发布:editplus怎么运行java 编辑:程序博客网 时间:2024/06/08 10:25

首先建立头文件“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;}

0 0