队列的相关概念
定义和术语
队列:只允许在表的一端删除元素,在另一端插入元素的线性表;
空队列:不含元素的队列;
队首:队列中只允许删除元素的一端,head,front;
队尾:队列中只允许插入元素的一端,rear,tail;
队首元素:处于队首的元素;
队尾元素:处于队尾的元素;
进队:插入一个元素到队列中;
出队:从队列中删除一个元素。
先进先出
队列及其操作
队列的进队和出队
将新元素插入到队尾,出队将队首元素删除
队列的基本操作
1 | InitQueue(q); //初始化,将q置为空队列 |
链式队列
一般形式
Q.front
队首指针,指向表头结点
Q.rear
队尾指针,指向队尾结点
Q.front->data
不放元素
空队列
非空队列
定义结点类型
- 存放元素的结点类型
1 | typedef struct Qnode |
- 由头尾指针组成的结点类型
1 | typedef struct |
生成空队列算法:初始化队列
1 |
|
例子
1 | main() |
(空队列时)插入新元素x
插入新元素e的算法
1 | LinkQueue EnQueue(LinkQueue Q, ELemType e) |
例:插入一个新元素10
1 | main() |
元素的删除
队列删除元素时都是删除队首元素
若原队列有2个或2个以上结点
执行:Q.front->next=p->next;
若原队列只有1个结点
执行`free(p); Q.rear=Q.front;
链式队列的出队算法
1 | LinkQueue DelQueue(LinkQueue Q,Elemtype *e) |
顺序队列与“假溢出”
假设用一维数组Q[0…5]表示顺序队列
设f指向队头元素,r指向队尾元素的后一单元
- 初始化后
- A进队后
- A出队后
- B进队后
移动元素开销大
方法二:将Q当循环表使用
当f=r时,如何分辨是空队列和满队列?
解决方案:增加一个标识变量
方案二:还剩最后一个单元不使用,可避免满队列时出现的二义性。
即:进队前测试
若r+1=f,表明还剩最后一个单元,认为此时就是满队列
定义队列的C类型
1 |
|
进队算法
假设Q表示顺序队列,头指针front指向队头元素,rear指向队尾元素的后一个空位,e为进队元素。
1 | int En_Queue(SeQueue &Q,ElemType e) |
出队算法
1 | int De_Queue(SeQueue &Q,ElemType &e) |
提醒:f指向队首元素,r指向队尾元素后一单元。