队列
定义:限定在表的一端进行删除,在表的另一端进行插入操作的线性表
队头(front):允许删除的一端
队尾(rear):允许插入的一端
特性:FIFO
链队列——队列的链式存储结构
实质是带头结点的线性链表
两个指针:
队头指针Q.front指向头结点
队尾指针Q.rear指向尾结点
初始态:队空条件
头指针和尾指针均指向头结点:Q.front=Q.rear
链队列的类型定义:
typedef struct QNode
{
QElemType data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
LinkQueue Q;
基本操作及实现:
顺序队列
顺序队列:
用一组 地址连续 的存储单元依次存放从队列头至队列尾的元素
设两个指针:
Q.front 指向队列头元素
Q.rear 指向队列尾元素的下一个位置
初始状态(空队列):
Q.front=Q.rear=0;
队列的真满和假满:
类型定义:
#define MAXSIZE 100
typedef struct
{
QElemType *base;
int front;
int rear;
}SqQueue;
SqQueue Q;
循环队列——队列的顺序存储结构
基本操作:
初始化:Q.rear=Q.front=0;
判空:Q.front==Q.rear;
判满:(Q.rear+1)%MAX==Q.front;
入队:Q.rear=(Q.rear+1)%MAX;
出队:Q.front=(Q.front+1)%MAX;
最多元素个数:MAX-1
队列长度:(Q.rear-Q.front+MAX)%MAX
说明:
不能用动态分配的一维数组来实现循环队列,初始化时必须设定一个最大队列长度
循环队列中有一个元素空间浪费掉,用来解决Q.front=Q.rear补不能判别队列空还是满的问题:
使用一个计数器记录队列中元素的总数
设置一个标志变量以区别队列是空是满