算法与数据结构--队列和循环队列

一.队列的基本概念

队列是另一种特殊的表,这种表只在表首(也称为队首)进行删除操作,只在表尾进行插入操作。
队列的修改是按先进先出的规则进行的,所以队列又称为先进先出表,First In First Out,简称FIFO表。映射到生活中就是排队的队伍。


如示意图所示,a(1)就是队首元素,a(n)就是队尾元素。队列中的元素是按顺序进入的,退出队列也只能按照这个次序一次退出。

特点:队首删除快,队尾插入快,适用于在队首频繁删除,在队尾频繁插入的场景。

二.队列的基本运算

1.QueueEmpty(Q):测试队列Q是否为空
2.QueueFull(Q):测试队列Q是否已满
3.QueueFirst(Q):返回队列Q的队首元素
4.QueueLast(Q):返回队列Q的队尾元素
5.EnterQueue(x,Q):在队列的Q的队尾插入元素x
6.DeleteQueue(Q):闪出并返回队列Q的队首元素

三.队列的实现

1.用指针实现队列--链式队列(简称链队)

队尾(rear)——指向插入端的指针
队头(front)——指向删除端的指针

2.用循环数组实现队列--循环队列

【1】先考虑用普通数组实现队列会遇到的问题--假溢出

什么是假溢出呢?
系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为“假溢出”。

使用普通队列实现为什么会出现假溢出?
简单说根本原因就是删除元素后front指针会向上移动,导致front下面的空间无法再利用。

【2】解决方法--循环数组实现循环队列

简单说就是rear/front到M-1时再插入/删除元素就会返回0从头开始。这是循环队列和顺序队列的主要差别。

【3】循环队列队空队满判定优化

循环队列和顺序队列一样还有一个不完美的地方。就是队空和队满的判定条件都是front==rear,这就无法判断队空还是队满状态。

解决方案:
1.另外设一个标志以区别队空、队满

2.少用一个元素空间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值