Queue
基本定义
仅限定在一端进行插入,另一端进行删除的特殊线性表,FIFO
数据结构实现
链式实现:链式队列
代码
typedef struct _queuenode{
Elemtype data;
struct _queuenode * next;
}QueueNode;
typedef struct _linkqueue{
QueueNode * front, *rear;//front指针恒等于head,这样出队方便改变指针指向
}LinkQueue;
特点
适合元素变动大的情况,并且能减少空间碎片化问题
注意:链式队列由于有front和rear指针,当队列中最后一个元素出队时,rear指针指向无意义的出队元素,应重新给rear赋值为front
顺序实现:循环队列
#define MAXSIZE 100
typedef struct _sqqueue{
Elemtype *queue;
int front, rear;//用下标指示队头队尾
}SqQueue;
特点
循环队列一般留出一个位置用于区分队满和队空,rear指向队尾元素下一个位置
- 入队:rear = (rear+1)%MAXSIZE
- 出队:front = (front+1)%MAXSIZE
- 判断队满:front==(rear+1)%MAXSIZE
- 判断队空:front==rear
基本操作
判断队空,判断队满,出队,入队
双端队列
指不止一端可以出队或者入队的特殊队列。分为如下三类
- 双端队列:两端均可入队/出队
- 输入受限的双端队列:只有一端可以入队,两端均可出队
- 输出受限的双端队列:只有一端可以出队,两端均可入队
Tips:判断输出序列是否合法,可以将输出序列按可能的方式排列到队列内,再考虑是否可以由指定的输入序列得到这样的排列
队列的应用
- 操作系统中进程调度队列、I/O任务队列