线性表之队列(queue)结构

1、队列的定义  队列和栈一样同样是操作受限的一种数据结构,但是和栈不一样的是,队列是一种先进先出(first in first out FIFO)的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。在队列中,允许插入操作的一端被称之为队尾(rear),允许删除的一端称为队头(front)。  队列在程序设计中是很常见的一种数据结构,例如操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业在运行,这些作业被按照队列的方式进行排队。我们给出一个图示方便理解:2、队列的表
摘要由CSDN通过智能技术生成
1、队列的定义

  队列和栈一样同样是操作受限的一种数据结构,但是和栈不一样的是,队列是一种先进先出(first in first out FIFO)的线性表,它只允许在表的一端进行插入操作,而在另一端进行删除操作。在队列中,允许插入操作的一端被称之为队尾(rear),允许删除的一端称为队头(front)
  队列在程序设计中是很常见的一种数据结构,例如操作系统中的作业排队。在允许多道程序运行的计算机系统中,同时有几个作业在运行,这些作业被按照队列的方式进行排队。我们给出一个图示方便理解:
在这里插入图片描述

2、队列的表示方式

  前面我们知道栈的表示方式有两种,一种是顺序表示方式;另一种就是链式。同样对于队列而言也有链式队列和顺序队列两种表示方式。

  • 链队列

  从队列的定义可以知道,要用链式结构来表示队列则需要两个指针,这两个指针分别指向队首和队尾,为了操作方便可以给链队列添加一个头结点,因此如果判断一个链式队列是否为空就可以判断头指针和尾指针是否都指向头结点。我们来看看对于一个链式队列,它的入队操作和出对操作,指针的指向变化。
在这里插入图片描述
在上面的图示中,左边是链式队列的存储结构。
右边的a图示表示,这个队列为一个空队列,可以看到当队列为空时,此时front指针和rear指针均指向头结点。
b和c图示中,表示往队列中先后添加一个元素x和一个元素y,可以看到,当往队列里面添加一个元素时,队尾指针rear会指向这个新添加的元素结点,在添加x时,rear指针指向了x,当添加y时,rear指针又指向了y
在d图示中,删除了元素x,我们说过队列是操作受限的数据结构,因此只能在队首删除,当删除元素x后,我们看到调整了front指针,使它指向了后面的结点。
我们看到在入队列和出队列的操作中也是比较简单的,就是简单地调整指针指向,需要注意的是在手动管理内存的语言中,在删除一个元素结点后,别忘记释放该节点的内存空间。

  • 顺序队列和循环队列

  和栈的顺序表示方式相同,顺序队列也是用一组地址连续的内存空间依次存储从队头到队列尾的元素,此外除了元素本身外还需要两个指针分别指向队头元素位置和队尾元素位置。因此对于顺序队列,它的结构如下图:
在这里插入图片描述
在a图示中,表示的是一个队列刚刚被初始化后的结构,可以看到这时,队列的队首指针和队尾指针均指向第一个内存单元。
在b图示中,先后往队列中添加了e1,e2,e3三个元素,此时队尾指针rear指向最后一个元素的下一个内存空间。
在c图示中,当我们对队列中的e1,e2先后进行出队列操作,也就是删除操作,可以看见此时队首指针front指向了队列中的被删除元素后的下一个元素内存地址。
在d图示中,我们可以看到又向队列中添加了元素,此时队列的空间已经满了。
  请试想一下这个问题,在上面的图示d中,我们看见在当前队列中我们为数组分配的空间为7的容量,此时数组中的最后一个位置也放进去了一个元素,此时已经不能再向队列尾再添加元素了,因为此时再添加就会导致数组越界了。你可能会想那就动态扩容啊,另外新申请一个内存空间再将原来的元素搬移进去,这样虽然是可以的,但是仔细看我们原来的队列中明明还有可以利用的空间,之前的元素被删除的位置也可以放新的元素进去,那么问题就在于我们如何去找到这些位置。由一个巧妙的方法就是将队列构造成一个环状的结构,这就是循环队列,我们来看看它的逻辑结构图。
在这里插入图片描述
  现在我们了解了循环队列的逻辑结构后,来看看在插入和删除元素时,指针的指向是如何变化的?在这里插入图片描述
在a图示中是队列处于某个状态下&#

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值