队列结构的定义和属性
定义:队列是一种与线性表相似的线性结构。但仅允许在表的一端进行插入,而在表的另一端进行删除。
队列结构的几个属性:
- 队尾:插入的一端叫做队尾
- 队头:删除的一端叫做队头
- 入队:向队列中插入新节点元素称为入队
- 出队:从队列中删除节点元素称为出队
- 队空:当队列中无节点元素时,表示队空
- 队满:当队列中节点超过允许存储空间时,表示队满(链队无队满的状态)
从队列的基本定义和操作来看,队列是一种具有先进先出特点的数据结构。
队列结构的抽象数据类型
ADT Queue
{
数据对象:
D = {ai | ai∈ElemType, i=1,2,…,n, n≧0 } //ElemType为类型标识符
数据关系:
R = {<ai, ai+1> | ai, ai+1∈D, i=1,3,…,n-1 }
数据操作:
(1) queSeq * InitQueue(); //初始化队列
(2) void DestroyQueue(queSeq *q); //销毁队列
(3) Bool QueueEmpty(queSeq *q); //判断队列是否为空
(4) int QueueLength(queSeq *q); //返回队列中数据元素个数
(5) void enQueue(queSeq *q, ElemType e); //入队
(6) Bool deQueue(queSeq *q, ElemType *e); //出队
}
可以发现,相比于线性表,队列的抽象运算和栈同样受到限制。
顺序队列
顺序队列利用数组存放节点元素,同时设置两个变量 front
和 rear
分别保存队头和队尾的索引。
front
保存队头索引,即是数组索引小的一端; rear
保存队尾索引,即是数组索引大的一端。
定义顺序队列的存储结构:
#define MaxSize 50
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int front, rear; // 队头和队尾指针
} queSeq;
初始化队列时,设置变量 front
= rear
= -1,表示队列为空。
队列执行增删操作时,都需要先把 front
或 rear
向前移动一位,然后再执行取值或赋值。
由此可知,rear
位置保存队尾元素,front
位置为空,front+1
位置保存队头元素。
当 rear
= MaxSize - 1
时,表示数组已达到存储上限,即是队满了。
当 front
= rear
时,表示队头和队尾保存同一个位置,因为逻辑上 front
位置为空,所以队列为空。
front
位置物理上不为空,因为并没有释放该位置的内存,只是逻辑上认为是空的。
顺序队列代码实现:
#include <stdio.h>
#include <stdlib.h>
#define true 1
#define false 0
#define MaxSize 50
typedef int Bool;
typedef char ElemType;
typedef struct
{
ElemType data[MaxSize];
int front, rear; // 队头和队尾指针
} queSeq;