2.2.5 队列

1.队列的定义

队列也是一种线性结构,是一种特殊的线性表,即仅允许在表尾端进行插入操作、在表头端进行删除操作。允许插入操作的表尾端被称为队尾,允许删除操作的表头端被称为队头。

   假设有一个含有n个元素的队列,记为q=(a1,a2,....,an),则称a1为队头元素,an为队尾元素,队列中的元素按a1,a2,....an的顺序依次插入,而删除时,则也是按a1,a2,....an的顺序依次删除,这种原则可以形象的描述为‘先进先出’或‘后进后出’。

               

                                                             图2.2.13队列示意图

队列的基本运算(或操作)包括入队、出队、取队头元素等。

2.队列的顺序存储

队列的存储结构和线性表类似,也分顺序存储和链式存储。同样的,在这里只重点说明队列的顺序存储结构。队列的顺序存储即使用一组地址连续的存储单元依次存放自队头至队尾的数据元素,同时设置两个指针,一个front指针指向队头元素的前一个位置,一个rear指针指向队列队尾元素。栈的顺序存储结构如下图所示: 

图2.2.14栈的顺序存储结构

    当front指针等于rear指针时,表明该队列没有数据元素,为空队列。

队列的基本运算(或操作):

  • 取队头元素,在队列中,队头指针front指向的是队头元素的前一个位置,所以在取队头元素时,可以利用队头指针减1,来指向队头元素的位置,并通过该位置取出队头元素。
  • 入队,就是在队尾插入一个新的元素,此时将新元素存储在队尾指针加1指向的位置,然后将队尾指针加1,重新指向新的队尾元素。
  • 出队,就是删除队头元素,可以利用队头指针减1,来指向队头元素的位置,将队头元素删除后,同时将队头指针减1,使其指向原先队头元素的位置。

                                                     图2.2.16 队列的操作示例

3.循环队列

    从图2.2.16可以看出,在顺序存储的情况下,随着队列频繁的入队、出队操作,会导致头指针逐步后移,新入队的数据项需占用新的存储空间,而队头数据项出队后的留下的存储空间无法被再次使用,造成了空间浪费。为了解决此问题,一般队列在使用顺序存储时,会采用循环队列的方式。

所谓的循环队列,就是在给定的存储空间的情况下,如果rear指针指向最后一个位置时,还需要入队,则此时rear指针开始指向存储空间的第一个位置,即原始队头的位置。这样就可以重新利用出队留下的存储空间了。

假设一个队列分配的存储空间为5,其入队和出队操作如下图所示:

                                             图2.2.17 循环队列的操作示例

从上图可以得出,当front=rear时,有可能是空队列,也有可能是满队列(即存储空间均被占用了)。在实际使用循环队列时,一般会有一个标识,当标识为0时,表明该队列是空队列,当标识为1,且front=rear时,则表明该队列是满队列。

4.链队列

队列除了采用顺序存储外,也可以采用链式存储。队列的链式存储一般是采用单链表,每一个数据项用一个结点来表示,front指向队头结点,rear指向队尾结点。链式队列的结构如下图所示:

                                                     图2.2.18 链式队列结构

链式队列操作逻辑:

出队时,将front指向的结点删除,同时将该结点的指针域的值赋予front,使front指向下一个结点。

入队时,新增一个结点,将该新增结点的地址赋予rear指向的队尾结点的指针域,同时将rear也指向该新增结点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值