队列:具有一定操作约束的线性表
- 插入和删除操作:只能在一端插入,而在另一端删除
数据插入:入队列(AddQ)
数据删除:出队列(DeleteQ)
先来先服务:
先进先出:FIFO
队列的抽象数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的又穷线性表
操作集:长度为MaxSize的队列Q∈Queue,队列元素item∈ElementType
1、Queue CreateQueue(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(Queue Q):将队头数据元素从队列中删除并返回
队列的顺序存储实现
队列的顺序存储结构通常由一个一维数组和一个记录队列头元素位置的变量front以及一个记录队列尾元素位置的变量rear组成。
循环队列

#define MaxSize 100 struct QNode { ElementType Data[MaxSize]; int rear; int front; }; typedef struct QNode *Queue;
增加队列

void AddQ(Queue PtrQ, ElementType item) { if((PtrQ->rear+1)%MaxSize == PtrQ->front) { printf("Queue full"); return; } PtrQ->rear = (PtrQ->rear+1)%MaxSize; PtrQ->Data[PtrQ->rear] = item; }
删除队列

ElementType DeleteQ(Queue PtrQ) { if(PtrQ->front == PtrQ->rear) { printf("Queue empty"); return ERROR; } else { PtrQ->front = (PtrQ->front+1)%MaxSize; return PtrQ->Data[PtrQ->front]; } }
我的使用整合

1 #define MaxSize 100 2 3 struct QNode { 4 ElementType Data[MaxSize]; 5 int rear; 6 int front; 7 }; 8 typedef struct QNode *Queue; 9 10 int IsEmpty(Queue Q) 11 { 12 return (Q->rear == Q->front); //1:empty 0:not empty 13 } 14 15 void AddQ(Queue PtrQ, ElementType item) 16 { 17 if((PtrQ->rear+1)%MaxSize == PtrQ->front) { 18 printf("Queue full"); 19 return; 20 } 21 PtrQ->rear = (PtrQ->rear+1)%MaxSize; 22 PtrQ->Data[PtrQ->rear] = item; 23 } 24 25 ElementType DeleteQ(Queue PtrQ) 26 { 27 if(PtrQ->front == PtrQ->rear) { 28 printf("Queue empty"); 29 return -1; 30 } else { 31 PtrQ->front = (PtrQ->front+1)%MaxSize; 32 return PtrQ->Data[PtrQ->front]; 33 } 34 }
队列的链式存储实现
队列的链式存储结构也可以用一个单链表实现。插入和删除操作分别在链表的两头进行;
队列指针front和rear应该分别指向链表的哪一头?

struct Node { ElementType Data; struct Node *Next; }; struct QNode { struct Node *rear; struct Node *front; }; typedef struct QNode *Queue; Queue PtrQ;
出队操作

ElementType DeleteQ(Queue PtrQ) { struct Node *FrontCell; ElementType FrontElem; if(PtrQ->front == NULL) { printf("Queue empty"); return ERROR; } FrontCell = PtrQ->front; if(PtrQ->front == PtrQ->rear) PtrQ->front = PtrQ->rear = NULL; else PtrQ->front = PtrQ->front->Next; FrontElem = FrontCell->Data; free(FrontCell); return FrontElem; }