队列

来源:互联网 发布:读音软件 编辑:程序博客网 时间:2024/05/29 18:51

与栈一样,队列也是一种操作受限的线性表。队列的插入操作只允许在表尾一端进行,而删除操作只允许在表头一端进行。队列根据存储方式的不同,可分为顺序队列和链式队列。

队列的逻辑结构是线性表,与栈一样,也可与数组相同的顺序存储方式存储队列。

队列中的数据元素类型相同,称为队列元素。往队列里插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列也称为先进先出表。

队列中允许插入的一端称为队尾,允许删除的一端称为队头。在插入和删除操作中,队尾和队头不断变化。不含队列元素的队列称为空队列。

建立顺序存储队列也必须为其静态分配或动态申请一片连续的存储空间,并设置两个指针进行管理。一个指针是队头指针front,它指向队头元素;另一个指针是队尾指针rear,它指向下一个入队元素的存储位置。

对于简单的插入删除方式,每次在队尾插入一个元素,rear增1;在队头删除一个元素,front增1,随着插入和删除操作的进行,队列元素的个数不断变化,队列所占的存储空间也在为队列结构所分配的连续空间中移动。当front=rear时,队列中没有任何元素,成为空队列。当rear增加到指向所分配的连续空间之外时,队列无法再插入新元素,但这时往往还有大量可用空间未被占用,这些空间是已经出队的队列元素曾经占用过的存储单元。

在实际使用队列时,为了使队列空间能重复使用,往往要对队列的使用方法稍加改进:不论插入或删除,一旦指针rear增1或front指针增1越出了所分配的队列空间。就让它指向这片连续空间的起始位置。指针从maxsize-1增1变到0可用取余运算rear%maxsize和front%maxsize来实现。这实际上是把队列空间想象成一个环形空间,环形空间中的存储单元循环使用,用这种方法管理的队列也就称为循环队列。除一些简单应用之外,计算机应用中真正实用的队列是循环队列。

在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有maxsize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判断空的条件是front=rear,而队列判断满的条件是front=(rear+1)%maxsize。

优先级队列

前面讨论的队列的操作特点是“先进先出”,但许多应用需要另一种队列:每次入队的元素任然顺序从队尾插入,但每次从队列中取出的都是具有最高优先级的元素,这种队列称为优先级队列。在优先级队列中,插入操作和一般队列相同,只是简单地把一个新的元素数据加入队列中,而删除操作则与一般队列不同,要删除的是队列中优先级最高的元素。类似地,插入操作可以按优先级执行,删除操作按一般队列的模式执行。


0 0
原创粉丝点击