了解队列,不妨想象一下排队,比如在食堂排队打饭,先排上的人先接受服务,接受完服务之后退出(出队),后来的人只有在队尾插入队列(入队)。因此队列有队列头和队列尾,队头用于删除元素操作,队尾用来插入元素操作。

实现队列的方式有很多种,静态数组,动态数组和链式结构实现。

更官方一点这么描述队列:

队列的长度以及队列的元素类型等:

对队列的操作主要有以下几种:

队列的顺序存储实现:

上图定义了一个队列的结构,包含的元素为一个数组,一个队头和队尾的下标变量。

下面举例说明队列的顺序存储实现:

一开始的时候,队列的Front 和 Rear 都初始化为 -1,表示队列为空。

接下来,我们往队列里面加入一个工作,表示入队:我们知道入队是在队尾实现的,所以Rear下标加1,变为0.

再加入一个工作,Rear继续往后挪动:

接下来注意了,我们开始删除一个工作,我们上面也说了删除在队头删除:此时Front为0.

下面继续一系列这类的过程:总结起来就是当你入队时,队列的Rear加1,删除一个元素(出队),Front加1.

上图中的这个状态值得讨论一番,此时,队列尾部已经到头(已经排到数组的尾部),无法再加入,可是呢?队列头部又还有空间?怎么办呢?

解决这个问题的思路也很自然,后面排不下了,那就排到前面去嘛,下面引用顺环队列(也叫循环队列):

如下图,将上述数组形成一个环:

我们约定,一开始Front和Rear相等并指向某一个位置,Front和Rear相等的时候,队列为空:

接下来,我们加入元素:

删除一个元素(出队):

经过一系列操作,到达这个位置:

此时,我们如果再放一个元素:

那么队列的Front和Rear又指向了同一个位置,此时就存在一个问题了:

正如上图所说,Front == Rear ,队列是空还是满?

无法甄别!

如下思考:

可知,如果队列数组大小为N,则Front和Rear差距有N种情况,我们就是要依靠这N种情况来判断队列的情况,而队列装载元素情况有N + 1种,所以用N种状态来判别N + 1 种情况是不可能实现的。

必须另寻他路!

解决方案有三种:

1 是使用额外标记 Size,当你添加一个元素时,Size加1,删除一个元素时,Size减1,这样最后根据Size值是0还是队列数组的长度来判断队列是为空还是满。

2 是使用额外标记 tag,当你添加一个元素时,tag为1,删除一个元素时,tag为0,这样可以根据最后tag为1还是0来判断队列是空还是满。

3 是如果数组空间为n,那么我只使用n - 1个数组空间,这样就不会出现队列为空和满,Front和Rear都是相等的尴尬情况了。这也是我们下面所要采取的方法。

实现队列

判断队列满的原理是:

以下图这种情况为例:

执行下面这段代码,肯定成立,这是就说明队列满了!

像下面这种未满的情况:

执行下面的代码:

可见,继续在rear为4的这个数组位置插入一个元素!

出队列前,先判断队列是否为空。

如果不为空,则 front 加 1 这个位置的元素返回。


最后,提示下,上面所说的都是传统的队列实现方法。

队列的链式结构实现见博文:【 C 】队列的链式存储实现

【 C 】队列 简记相关推荐

  1. 【 C 】队列的链式存储实现

    上篇博文:([ C ]队列 简记)简单的讲了一下队列,对队列的基本知识有了一个简单的了解,这篇博文承接上篇博文,主讲如何通过链式结构来实现队列. 如上图,提出了一个问题,队列的插入和删除操作分别在链表 ...

  2. CTU Open Contest 2016 Suspicious Samples(单调队列)

    题目链接 http://codeforces.com/gym/101505/attachments 题目大意 按时间顺序给你n个点, 每个点有一个时间t, 和值v. 我们要把所有点和规定时间内所有点进 ...

  3. 2019上交、上科、北航、中科大、自动化所计算机夏令营+浙大计算机预推免简记

    2019上交.上科.北航.中科大.自动化所计算机夏令营+浙大计算机预推免简记 写在前面 附自己整理的相关复习资料 前六学期个人情况简述 上海交通大学(7.4--7.5) 概况介绍 学院机试 学院面试 ...

  4. RabbitMQ 入门系列(2)— 生产者、消费者、信道、代理、队列、交换器、路由键、绑定、交换器

    本系列是「RabbitMQ实战:高效部署分布式消息队列」和 「RabbitMQ实战指南」书籍的读书笔记. RabbitMQ 中重要概念 1. 生产者 生产者(producer)创建消息,然后发送到代理 ...

  5. Redis 笔记(04)— list类型(作为消息队列使用、在列表头部添加元素、尾部删除元素、查看列表长度、遍历指定列表区间元素、获取指定区间列表元素、阻塞式获取列表元素)

    Redis 的列表是链表而不是数组.这意味着 list 的插入和删除操作非常快,时间复杂度为 O(1),但是索引定位很慢,时间复杂度为 O(n). 当列表弹出了最后一个元素之后,该数据结构自动被删除, ...

  6. 翻转二叉树 c语言实现 递归 栈 队列

    前言 题目比较好理解,就是翻转二叉树 代码 c语言实现 #include<stdio.h> #include<stdlib.h> #include<string.h> ...

  7. 队列:实用程序服务和数据结构

    队列:实用程序服务和数据结构 Queues: utility services and data structures 队列实用程序服务 Nucleus RTOS有四个API调用,它们提供与队列相关的 ...

  8. 2021年大数据Kafka(一):❤️消息队列和Kafka的基本介绍❤️

    全网最详细的大数据Kafka文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 消息队列和Kafka的基本介绍 一.什么是消息队列 二.消息队列的应用场景 ...

  9. Laravel/Lumen 使用 Redis队列

    一.概述 在Web开发中,我们经常会遇到需要批量处理任务的场景,比如群发邮件.秒杀资格获取等,我们将这些耗时或者高并发的操作放到队列中异步执行可以有效缓解系统压力.提高系统响应速度和负载能力. 二.配 ...

最新文章

  1. 那些不回微信的人,都在想什么?
  2. python 中evaluationcontext是什么_Pytorch evaluation每次运行结果不同的解决
  3. DB2数据库备份转成MySQL_DB2 数据库备份(集中化)
  4. CentOS 初体验十九:yum安装redis
  5. 你可能没看懂Supercell的新游戏
  6. mysql 5.7.11 授权_mysql 5.7.11 安装配置教程
  7. Educational Codeforces Round 81 (Rated for Div. 2) D. Same GCDs 欧拉函数\莫比乌斯
  8. java中图的封装,模拟java 中地图的功能封装一个有序的地图
  9. matlab 防雷硒堆,单相全控桥式晶闸管整流电路的设计(阻感负载)电力电子课程设计...
  10. Makefile:.d依赖文件
  11. 剑指offer面试题10- II. 青蛙跳台阶问题(动态规划)(递归)(斐波那契数列)
  12. 移动硬盘提示由于IO设备错误,无法运行此项请求要怎么办啊
  13. 3. DICOM图像层级分类-DCMTK-数据字典避坑
  14. 【方差分析】之matlab求解
  15. 一些音视频相关概念学习笔记
  16. 如何通过几何画板学这些定理
  17. win10应用闪退解决方法
  18. 计算机设备调试及维护,计算机安装、调试及维护工职业标准-简.doc
  19. cobalt strike各种beacon的详解(http/https/tcp)
  20. Linux运维方向技能

热门文章

  1. Windows 7使用MMC管理控制台“远程桌面”功能【转载】
  2. 必须掌握的八个【cmd 命令行】[转]
  3. c语言是函数式原型的编程,编程范式|程序世界里的编程范式,探索编程本质
  4. jquery mysql jsp搜索功能_实现搜索框自动提示功能(jquery+php)
  5. python正确的赋值语句-Python 赋值语句技巧之序列解包
  6. php+jq+添加css,jquery如何添加css样式?
  7. mysql无法插入行_在mysql中数据才插入20多行就报错,求救啊!!!
  8. 微型计算机实验代码,上师大,微型计算机实验全代码.doc
  9. linux apache无法启动,linux mysq 无法启动 apache 无法启动
  10. 智能车竞赛技术报告 | 单车拉力组 - 沈阳航空航天大学 - 青梅绿茶队