队列预习

1. 队列定义

队列属于先进先出型, 队列是一种特殊的线性表,只能在前端(front)进行删除操作,只能在后端(rear)进行删除操作

2. 顺序队列

每次插入,指针rear加一,每次删除,指针front加一

3. 循环队列

初始化时,rear = front=0,当队列不为空时,front指向队列中的第一个元素,rear指向队列中最后一个元素的下一个位置,当队列满时 rear=front,但不一定是位置0

4. 循环序列判空的方法是rear = front;

判满的方法是 rear+1%Maxsize ==front

5. 进队列步骤

(1) 判断队列是否满,即,rear+1是否等于front,若等于则队列已满,不允许进入; 2 若不满,则将值保存至rear+1的位置 ; 从这里也可以看出,循环数列所能存储的值其实是最大值-1

6. 队列的链式存储结构

队列的链式存储结构即线性表的单链表,但只能尾进头出,简称链队列。将对头指针指向链队列的头结点,而队尾指针指向终端结点。

7. 队列的链式存储结构的出入队

入队:把拥有元素e新节点s赋值给原队尾结点的后继,把当前的s设置为队尾结点,rear指向;

出队:头结点的后继结点出队,将头结点的后继改为其后面的结点。若链表除头结点外只剩一个元素时,则需将rear指向头结点。

8. 循环队列和链队列的比较

在时间上:基本操作都是常数时间,即都为01),不过循环队列是事先申请好空间,使用期间不释放;而对于链队列,每次申请和释放结点也会存在时间开销,若出队入队频繁两者还是有细微区别

在空间上:循环链表必须有一个固定长度,所以就有了存储元素个数和空间浪费的问题;而链队列尽管需要一个指针域,会产生一些空间上的开销,但可以接受,所以链队列更加灵活。

9. 何时用循环队列和链队列

在可以确定队列长度最大值的情况下有循环队列;无法预估队列长度时用链队列。

10. 队列顺序存储的不足

我们假设一个队列有n个元素,则顺序存储的队列需要建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1)。与栈不同的是:队列元素的出列是在队头,即下标为0的位置,意味着一个元素出队后,队列中的其他所有元素都得向前移动,以保证队列的队头,也就是下标为0的位置不为空,该时间复杂度为O(n)。在现实中也是如此,一群人排队买票,前面的人买好了离开,后面的人就要全部向前一步,补上空位。如果不去限制队列的元素必须存储在数组的前n个单元的这一条件,出队的性能就会大大增加。也就是说,队头不需要一定在下标为0的位置。为了避免当只有一个元素时,队头和队尾重合使处理变得麻烦,所以引入两个指针,front指针指向队头元素,rear指针指向队尾元素的下一个位置,这样当front==rear时,此队列不是还剩一个元素,而是空队列。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值