队列:
1.只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表
2.进行插入操作的一端称为队尾(入队列)
3.进行删除操作的一端称为队头(出队列)
4.队列具有先进先出(FIFO)的特性
由于顺序队列在操作上有诸多不便,(出队列时,要进行元素的搬移,效率低下,还会出现假溢出的问题)在此我们可以创建循环的顺序队列,即环形队列。
环形队列的实现:
构成:
typedef struct Queue{QDataType _array[MAX_SIZE];int _Front;//队列的头int _Back;//队列的尾int count;//队列中有效元素个数}Queue;
初始化:
void QueueInit(Queue* q){assert(q);q->_Front = q->_Back = 0;q->count = 0;}
入队列:
void QueuePush(Queue* q, QDataType data){assert(q);if (MAX_SIZE == q->count){printf("队列满!n");return;}q->_array[q->_Back++] = data;if (MAX_SIZE == q->_Back)q->_Back = 0;q->count++;}
出队列:
void QueuePop(Queue* q){assert(q);if (Empty(q)){printf("队列空!n");return;}q->_Front++;if (MAX_SIZE == q->_Front)//队头走到数组末尾,调整q->_Front = 0;q->count--;}
判空:
int Empty(Queue* q){return 0 == q->count;}
队列大小:
int Size(Queue *q){return q->count;}
队头元素:
QDataType Front(Queue* q){return q->_array[q->_Front];}
队尾元素:
QDataType Back(Queue* q){if (0 == q->_Back){return q->_array[MAX_SIZE - 1];}else{return q->_array[q->_Back - 1];}}完整代码:
queue.h
#pragma once#define MAX_SIZE 8typedef int QDataType;typedef struct Queue{QDataType _array[MAX_SIZE];int _Front;//队列的头int _Back;//队列的尾int count;//队列中有效元素个数}Queue;void TestQueue();void QueueInit(Queue *q); //初始化void QueuePush(Queue *q, QDataType data);//入队列void QueuePop(Queue *q);//出队列int Empty(Queue *q);//判空int Size(Queue *q);//队列大小QDataType Front(Queue *q);//队头元素QDataType Back(Queue *q);//队尾元素void QueuePrint(Queue *q);
queue.c
#define _CRT_SECURE_NO_WARNINGS 1#include"queue.h"//环形队列#include <stdio.h>#include <assert.h>void QueueInit(Queue* q){assert(q);q->_Front = q->_Back = 0;q->count = 0;}void QueuePush(Queue* q, QDataType data){assert(q);if (MAX_SIZE == q->count){printf("队列满!n");return;}q->_array[q->_Back++] = data;if (MAX_SIZE == q->_Back)q->_Back = 0;q->count++;}void QueuePop(Queue* q){assert(q);if (Empty(q)){printf("队列空!n");return;}q->_Front++;if (MAX_SIZE == q->_Front)//q->_Front = 0;q->count--;}int Empty(Queue* q){return 0 == q->count;}int Size(Queue *q){return q->count;}QDataType Front(Queue* q){return q->_array[q->_Front];}QDataType Back(Queue* q){if (0 == q->_Back){return q->_array[MAX_SIZE - 1];}else{return q->_array[q->_Back - 1];}}void QueuePrint(Queue *q){int i = q->_Front;for (; i < q->_Back; i++){printf("%d--", q->_array[i]);}printf("n");}void TestQueue(){Queue q;QueueInit(&q);QueuePush(&q, 1);QueuePush(&q, 2);QueuePush(&q, 3);QueuePush(&q, 4);QueuePush(&q, 5);QueuePush(&q, 6);QueuePush(&q, 7);QueuePrint(&q);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));QueuePop(&q);QueuePop(&q);QueuePop(&q);QueuePop(&q);QueuePrint(&q);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));QueuePush(&q, 8);QueuePush(&q, 9);QueuePush(&q, 10);QueuePush(&q, 11);QueuePush(&q, 12);printf("size = %dn", Size(&q));printf("front = %dn", Front(&q));printf("back = %dn", Back(&q));}