一、循环队列结构体
- typedef int QueueDataType;
- #define CQ_MAX_SIZE 10
-
- typedef struct CircularQueue
- {
- QueueDataType data[CQ_MAX_SIZE];
-
- /**标记队列首*/
- QueueDataType head;
-
- /**标记队列尾部*/
- QueueDataType rear;
-
- } CircularQueue;
二、循环队列操作函数声明
-
- /**创建队列*/
- CircularQueue* create_circular_queue();
-
- /**队列是否已满*/
- bool isFull(CircularQueue* queue);
-
- /**队列是否为空*/
- bool isEmpty(CircularQueue* queue);
-
-
- /**入队列*/
- bool enqueue(CircularQueue* queue,QueueDataType el);
-
-
- /**出队列*/
- QueueDataType dequeue(CircularQueue* queue);
-
-
- /**输出队列*/
- void show_queue(CircularQueue* queue);
-
- /**销毁队列*/
- void destory_queue(CircularQueue* queue);
三、循环队列操作函数定义
- /**创建队列*/
- CircularQueue* create_circular_queue()
- {
- CircularQueue* queue = (CircularQueue*) malloc(sizeof(CircularQueue));
- if(queue == NULL)
- {
- perror("CircularQueue分配内存空间失败");
- return NULL;
- }
- queue->head = 0;
- queue->rear = 0;
- return queue;
- }
-
- /**队列是否为空*/
- bool isEmpty(CircularQueue* queue)
- {
- return queue->head == queue->rear;
- }
-
- /**队列是否已满*/
- bool isFull(CircularQueue* queue)
- {
- // rear是冗余出来的一个空间,置于队尾,用于记当前队中元素的个数
- return (queue->rear + 1)%CQ_MAX_SIZE == queue->head;
- }
-
- /**入队列*/
- bool enqueue(CircularQueue* queue,QueueDataType el)
- {
- if(isFull(queue))
- {
- perror("队列已满");
- return false;
- }
- queue->data[queue->rear%CQ_MAX_SIZE] = el ;
- queue->rear++;
- return true;
- }
-
-
- /**出队列*/
- QueueDataType dequeue(CircularQueue* queue)
- {
- if(isEmpty(queue))
- {
- perror("对列中暂无元素");
- return -1;
- }
- QueueDataType el = queue->data[queue->head%CQ_MAX_SIZE];
- queue->head++;
- return el;
- }
-
-
- /**输出队列*/
- void show_queue(CircularQueue* queue)
- {
- if(isEmpty(queue))
- {
- perror("对列中暂无元素");
- return ;
- }
- int i = queue->head;
- while ( i < queue->rear)
- {
- QueueDataType el = queue->data[i%CQ_MAX_SIZE];
- printf("el=%d\n",el);
- i++;
- }
- }
-
-
- void destory_queue(CircularQueue* queue)
- {
- free(queue);
- }
四、测试队列
- void test_cricular_queue()
- {
- CircularQueue *quque = create_circular_queue();
- QueueDataType arr[] = {11,21,31,41,51,61,71,81,91,101};
- int i = 0;
- for(;i<10;i++)
- {
- enqueue(quque,arr[i]);
- }
- show_queue(quque);
- QueueDataType el = dequeue(quque);
- printf("取出队列元素el=%d\n",el);
- destory_queue(quque);
- }
运行结果:
