数据结构之队列
一:队列
队列(Queue):具有一定操作约束的线性表
插入和删除操作:只能在一端插入,而在另一端删除。
先来先服务
先进先出:FIFO
二:队列的抽象数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的有穷线性表。
操作集:长度为MaxSize的队列Q∈Queue,队列元素item c ElementType
1、Queue CreatQueue( int MaxSize ):生成长度为MaxSize的空队列;
2、int IsFullQ( Queue Q, int MaxSize ):判断队列Q是否已满;
3、void AddQ( Queue Q,ElementType item ):将数据元素item插入队列Q中;
4、int IsEmptyQ( Queue Q ):判断队列Q是否为空;
5、ElementType DeleteQ( Qucue Q):将队头数据元素从队列中删除并返回。
三:队列的顺序存储实现
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front 以及一个记录队列尾元素位置的变量rear组成。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define ElementType int 4 #define MAXSIZE 4 5 typedef struct QNode* Queue; 6 struct QNode 7 { 8 ElementType Data[MAXSIZE]; 9 int front; //对头 10 int rear; //对尾 11 }; 12 Queue CreateQueue() 13 { 14 Queue Q; 15 Q = (Queue)malloc(sizeof(struct QNode)); 16 Q->front = 0; 17 Q->rear = 0; 18 } 19 //判断队列是否满 20 int isFull(Queue Q) 21 { 22 return ((Q->rear + 1) % MAXSIZE == Q->front); 23 } 24 void AddQ(ElementType item,Queue PtrQ) 25 { 26 //判断队列是否满 27 if(isFull(PtrQ)) 28 { 29 printf("队列满\n"); 30 return; 31 } 32 //添加元素 33 PtrQ->rear = (PtrQ->rear + 1) % MAXSIZE; 34 PtrQ->Data[PtrQ->rear] = item; 35 } 36 //判断队列是否空 37 int isEmpty(Queue Q) 38 { 39 return (Q->front == Q->rear); 40 } 41 //出队 42 ElementType DeleteQ(Queue PtrQ) 43 { 44 //判断队列是否空 45 if(isEmpty(PtrQ)) 46 { 47 printf("队列空\n"); 48 return 0 ; 49 } 50 PtrQ->front = (PtrQ->front + 1) % MAXSIZE; 51 return PtrQ->Data[PtrQ->front]; 52 }
三:队列的链式存储实现
队列的链式存储结构也可以用一个单链表来实现。插入和删除操作分别在链表二头进行。
现在有一个问题,front 【头指针,删除元素】和 rear【尾指针,添加元素】 分别指向链表哪一头?
肯定是front 放在链表前【便于删除】,rear放在链表后【这个无论表头、表尾都可以】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define ElementType int 4 typedef struct QNode* Queue; 5 struct Node 6 { 7 ElementType Data; 8 struct Node* next; 9 10 }; 11 struct QNode 12 { 13 struct Node *front; //前 14 struct Node* rear; //后 15 }; 16 Queue CreateQueue() 17 { 18 Queue Q = (Queue)malloc(sizeof(struct QNode)); 19 Q->front = Q->rear = NULL; 20 return Q; 21 } 22 //队列是否空 23 int isEmpty(Queue queue) 24 { 25 26 return (queue->front == NULL); 27 } 28 //入队 29 void AddQ(ElementType item, Queue queue) 30 { 31 32 struct Node* node = (struct Node *)malloc(sizeof(struct Node)); 33 node->Data = item; 34 node->next = NULL; 35 //若队列为空 36 if(queue->rear == NULL) 37 { 38 queue->rear = node; 39 queue->front = node; 40 } 41 else //若队列不为空 42 { 43 queue->rear->next = node; 44 queue->rear = node; 45 } 46 } 47 //出队 48 ElementType DeleteQ(Queue queue) 49 { 50 //判断队列为空 51 if(isEmpty(queue)) 52 { 53 printf("队列为空\n"); 54 return 0; 55 } 56 struct Node* frontCell; 57 ElementType item; 58 frontCell = queue->front; 59 if(queue->front == queue->rear) //说明队列只有一个元素 60 { 61 queue->front = queue->rear = NULL; 62 } 63 else 64 { 65 queue->front = queue->front->next; 66 } 67 item = frontCell->Data; 68 free(frontCell); 69 return item; 70 }