前言
太久没更新了,早就说要写结果拖到现在。闲话说完,正式开始内容。
队列——顾名思义,其实在线性表中也是一种极其重要的结构。
与栈不同的是,栈对元素的插入和删除均在一端进行,而队列,从队头删除,队尾插入,正如日常生活中的排队一样,还是比较形象的。
本文将对队列的概念及操作函数进行简要介绍,并说明顺序队列(利用数组)和链式队列(利用链表)的一些基本算法。
一、队列的相关概念
1.队列及其操作 (先进先出)
1.1 相关概念
(1)队列:只允许在表的一端删除元素,在另一端插入元素的线性表
(2)空队列:不含元素的队列
(3)队首:队列中只允许删除元素的一端,又称head,front
(4)队尾:队列中只允许插入元素的一端,又称rear,tail
(5)进队(入队):将新元素插入到队尾
(6)出队:从队列删除一个元素,即删除队首元素
注:进出队可类比为排队
1.2 队列的基本操作
(1)InitQueue(q):初始化,将q置为空队列
(2)QueueEmpty(q):判断q是否为空队列
(3)EnQueue(q,e):将e插入队列q的尾端
(4)DeQueue(q,e):取走队列q的首元素,赋值给e
(5)GetHead(q,e);读取队列首元素,赋值给e
(6)QueueClear(q):置q为空队列
二、链式队列的基本操作
1.链式队列:运用链式结构进行存储的队列,一般用带表头结点的单链表表示
为提高插入删除效率,在头指针中设置两个指针
一般形式:
(1)Q.front:队首指针,指向表头结点
(2)Q.rear:队尾指针,指向队尾结点
注:当队列为空时,(1)(2)均执行表头结点
(3)Q.front->data:不放元素
(4)Q.fornt->next:指向队首结点a1
2.定义结点类型
(1)存放元素的结点类型:数据域和指针域
//定义结点类型
typedef struct Qnode
{
ElemType data;//其中数据域data为抽象元素类型
struct Qnode *next;//其中next为指针类型
}Qnode,*QueuePtr;//其中,Qnode为结点类型, QueuePtr:指向Qnode的指针类型
(2)由头、尾指针组成的结点类型
//由头、尾指针组成的结点类型
typedef struct
{
Qnode *front;//头指针
Qnode