队列
定义:具有一定操作约束的线性表。其插入和删除操作只能分别从一端进行。先进先出FIFO。
队列抽象数据类型描述
类型名称:队列(Queue)
数据对象集:一个有0个或多个元素的又穷线性表
操作集:长度MaxSize的队列
,队列元素
- Queue CreateQueue(int MaxSize):创建一个长度为MaxSize的空队列
- int IsFullQ(Queue Q,int MaxSize):判断队列Q是否已满
- void AddQ(Queue Q,ElementType item):将元素item插入队列
- int IsEmptyQ(Queue Q):判断队列Q是否为空
- ElementType DeleteQ(Queue Q):删除队头元素并返回
队列的顺序存储实现入队和出队操作:通常由一维数组和一个记录队列头元素位置的变量front和一个记录队列尾元素位置的变量rear组成。
//队列的定义 #include <stdio.h> #define ERROR typedef int ElementType; #define MaxSize 100 struct QNode{ ElementType Data[MaxSize]; int rear; int front; }; typedef struct QNode *Queue;
//队列的入队操作(循环队列) #include <stdio.h> typedef int ElementType; #define MaxSize 100 #define ERROR 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("队列满"); return; } PtrQ->rear = (PtrQ->rear + 1) % MaxSize; PtrQ->Data[PtrQ->rear] = item; }
//队列的出队操作(循环队列) ElementType DeleteQ(Queue PtrQ) { if (PtrQ->front == PtrQ->rear){ printf("队列空"); return ERROR; } else{ PtrQ->front = (PtrQ->front + 1) % MaxSize; return PtrQ->Data[PtrQ->front]; } }
队列的链式存储实现出队操作:
#include <stdio.h> typedef int ElementType; 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("队列为空"); 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; }