队列(Queue)简称队,是一种操作受限的线性表,只允许在表的一端进行插入,而在另一端进行删除。
特性
- 先进先出(First In First Out, FIFO)
- 入队(进队):在队尾插入元素
- 出队(离队):在队头删除元素
基本操作
| 操作 | 说明 |
|---|---|
| InitQueue(&Q) | 初始化队列 |
| QueueEmpty(Q) | 判断队列是否为空 |
| EnQueue(&Q, e) | 入队(插入元素) |
| DeQueue(&Q, &e) | 出队(删除元素) |
| GetHead(Q, &e) | 读取队头元素 |
顺序存储结构(循环队列)
#define MAXSIZE 100 // 最大队列长度
typedef struct {
QElemType *base; // 初始化的动态分配存储空间
int front; // 队头指针
int rear; // 队尾指针
} SqQueue;循环队列利用模运算(%)将顺序队列首尾相连。为了区分队空和队满,常用三种方式:
- 牺牲一个单元来区分队空和队满
- 类型中增设表示元素个数的数据成员
- 类型中增设 tag 数据成员
链式存储结构
typedef struct LinkNode {
ElemType data;
struct LinkNode *next;
} LinkNode;
typedef struct {
LinkNode *front, *rear;
} LinkQueue;双端队列
双端队列允许两端都可以进行入队和出队操作,其元素逻辑结构仍是线性结构:
- 输出受限的双端队列:允许在一端进行插入和删除,另一端只允许插入
- 输入受限的双端队列:允许在一端进行插入和删除,另一端只允许删除
应用
队列常用于层次遍历、操作系统缓冲区、广度优先搜索(BFS)等场景。