队列的实例:电影院购票、排队打饭、去麦当劳买吃的,银行排队叫号等等这些场合都需要排队,生活中的各种排队现象就展示了队列的实例

队列的介绍:队列是个有序列表

队列的实现方式:

  1. 数组
  2. 链表

注意:若使用数组来模拟实现队列,就是顺序存储,若使用链表来实现队列,就是链式存储。

队列的重要原则(或者叫做特点):先入先出(FIFO) ,也就是说谁先进入到队列谁就会先被调出去。即:先存入队列的数据要先取出,反之,后存入队列的数据要后取出

使用数组来模拟实现队列

画图分析:

rear : 表示队尾,就是队列的尾部

front:表示对首,就是队列的头部

当把数据添加到队列中时,front的值和位置不会产生变化,而rear队尾的位置和值会随着数据的增加变化而变化。由此说明,往队列中添加数据是从队列尾部rear加,变化的是rear,而不是front

当把数据从队列中取出时,rear的值和位置不会产生变化,而front队首的位置和值会随着数据的减少变化而变化。由此说明:往队列中取出数据是从队列头部front取出的,变化的是front,而不是rear


若使用数组的结构来存储队列的数据,则数组队列的声明如下图所示:

设计队列时,首先定义个ArrayQureue类,类中有4个属性(也叫做成员变量)分别是数组queueArr[]maxsizefrontrear

maxsize:代表队列的最大容量,就是该队列数组最大能存储多少个数据

rear:用来记录队列的队尾

front:用来记录队列的队首

queueArr[]:数组模拟实现队列,队列存的数据就是存放在数组中的。

队列的常用操作:(重要

  1. 创建队列
  2. 把数据添加到队列中(入队列)
  3. 把数据从队列从取出来(出队列)

入队列思路分析:

将入队列这个功能写成一个对应的成员方法addQueue(int n)

实现入队列需要两个步骤:

  1. 首先必须判断队列是否已满rear == maxsize - 1,当队尾rear = maxsize - 1时,则说明队列已经满了,就不能实现入队列了,反之,当队尾rear != maxsize - 1 || real < maxsize - 1时,则说明队列未满,就可实现入队列操作

    注意:判断队列是否满,取决于maxsizerear之间的关系

    画图分析:

  2. 将队尾rear ++,rear的位置往后移动以下,数据从队尾加入。

出队列思路分析:

将出队列这个功能写成一个对应的成员方法getQueue(int num)

实现出队列需要两个步骤:

  1. 首先判断队列是否为空rear == front,若队首和队尾相等了rear = front,则证明队列是空的,就不能实现出队列的操作,若强制实现出队列,会抛出数组下标越界异常,反之,则证明队列不为空,则可实现出队列的操作。

    注意:判断队列是否满,取决于frontrear之间的关系

    画图分析:

  2. 将队首front ++,front的位置往后移动以下,数据从队首取出。

    画图分析:

    front = - 1时, 队列中的第一个数据是queueArr[0],front指向的是队列头的前一个位置,front不包含这个queueArr[0]数据,当front ++ ;这时front = 0,然后实现return queueArr[front];出队列操作,则证明queueArr[0]出队列了,同理,队列中不再包含queueArr[0]这个数据,那么队列中的第一个数据所在的位置由原来的queueArr[0]变为了现在的queueArr[1]。画图分析:

代码实现:

import java.util.Scanner;
public class ArrayDemoTest{public static void main(String[] agrs){// 实例化 ArrayQueue对象ArrayQueue arrayQueue = new ArrayQueue(3);char c = ' ';Scanner input = new Scanner(System.in);boolean flag = true;while(flag){System.out.println("s (showQueue()) : 显示队列中的所有数据");System.out.println("a(addQueue()):  实现入队列操作,把数据添加到队列中");System.out.println("g(getQueue()):  实现出队列操作,把数据从队列中取出来");System.out.println("h (headQueue()) : 查看队列中的第一个数据");System.out.println("e (exit) : 退出程序");System.out.println("请选择(s、a、g、h、e):");c = input.next().charAt(0); switch(c) {case 'e':input.close(); flag = false;break;case 's':arrayQueue.showQueue();break;case 'a':System.out.println("请输入一个数:");int num = input.nextInt();arrayQueue.addQueue(num);break;case 'g':try{System.out.println("取出的数据是" + arrayQueue.getQueue());}catch(Exception e){System.out.println(e.getMessage());}break;case 'h':try{System.out.println("队列的第一个数据是" + arrayQueue.headQueue());}catch(Exception e){System.out.println(e.getMessage());}break;default:System.out.println("您输入的信息错误");break;}}System.out.println("程序正常退出");}
}
// 定义个ArrayQureue类
class ArrayQueue{// 编写属性(共4个)// maxsize : 表示队列的最大容量private int maxsize;// rear : 表示队列的尾部,即:队尾private int rear;// front :表示 队列的头部 即:队首private int front;// queueArr[] : 数组模拟实现队列,队列存的数据就是存放在数组中的private int queueArr[];// 编写队列的构造方法,实现将局部变量maxsize的值赋值给成员变量maxsize并对rear、front和queueArr[] 进行初始化// 带参构造public ArrayQueue(int maxsize){// 将局部变量maxsize的值赋值给成员变量maxsizethis.maxsize = maxsize;// 对rear、front和queueArr[] 进行初始化rear = -1;front = -1;queueArr = new int[maxsize];}// 无参构造public ArrayQueue(){}// 编写成员方法isFull(),用来判断队列是否满public boolean isFull(){// true : 满  false : 未满return rear == maxsize - 1; }// 编写成员方法isEmpty(),用来判断队列是否为空public boolean isEmpty(){// true : 空 false : 不为空return rear == front;}// 编写无返回值带参的成员方法,实现入队列addQueue(int num),类似于setXxx(形参列表)方法public void addQueue(int num){if(isFull()){// 抛异常做处理,给提示文字System.out.println("队列已满,不能实现入队列操作");return;}queueArr[++rear] = num;}// 编写有返回值无参的成员方法,实现出队列getQueue(),类似于getXxx()方法public int getQueue(){if(isEmpty()){throw new RuntimeException("空队列,不能实现出队列操作");}return queueArr[++front];}// 编写成员方法,使用增强for循环 | 普通for循环遍历队列中的所有数据.public void showQueue(){if(isEmpty()){System.out.println("空队列,没有数据可以遍历");return;}/*for(int temp : queueArr){System.out.print(temp + " ");}*/for(int i = 0;i < queueArr.length ; i++){System.out.println("queueArr[" + i + "] = " + queueArr[i]);}}// 编写成员方法,显示队列的第一个数据,注意:不是出队列public int headQueue(){if(isEmpty()){throw new RuntimeException("空队列,队列中没有数据");   }return queueArr[front + 1];}
}

问题及优化:

  1. 目前数组使用一次就不能使用了,没有达到复用的效果
  2. 将这个数组使用算法改进成环形队列的数组,核心是采用取模% 来实现的

总结:

  1. front 始终指向的是队列头的前一个位置,不是直接指向队列中的第一个数据,始终不包含队列中的第一个数据,front所指向的存储空间中始终没有数据。当rear 和front相等 时,front不包含队列中的任何数据,因为队列是空的,也无法实现出队列操作。

  1. rear指向队列的尾部的具体的数据,包含队列的最后一个数据。当rear 和front相等 时,rear不包含队列中的任何数据,因为队列是空的。

    画图分析:

  1. 判断队列是否满 ,取决于rearmaxsize的关系rear == maxsize - 1
  2. 判断队列是否为空 ,取决于rearfront的关系 rear == front

数组模拟实现队列(Java语言描述)相关推荐

  1. 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)

    题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...

  2. 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)

    题目要求 P1165题目链接 分析 标准的栈结构,但使用数组来模拟会更简单. 因为对于这个问题,其实数组不需要存储真实数值,只考虑当前最大值就行了. 毕竟,出栈也不需要返回当前真实值. 另外,我们只使 ...

  3. 利用循环队列的思想进行加密解密(洛谷P1914题题解,Java语言描述)

    前言 在我看来,理解循环队列对我们思考问题的帮助就是: 合理利用"%"的约束,将问题的"越界"重新弹回问题范围内. 本文就是一个例子,循环队列的思想为我快速秒杀 ...

  4. 《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组

    本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...

  5. Java版数据结构之数组模拟环形队列demo

    Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...

  6. 模拟DNF放技能的蓝耗问题(洛谷P2006题题解,Java语言描述)

    题目要求 P2006题目链接 分析 看来出题人喜欢DNF啊,还对蓝充足颇为渴求 (废话,没蓝干甚) -- 这题貌似水题,但AC率不高,因为有坑诶-- 首先是耗蓝为0的时候,伤害还是打的出来的(参考平A ...

  7. s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...

    <数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...

  8. 城市大轰炸(洛谷P1830题题解,Java语言描述)

    题目要求 P1830题目链接 分析 本题就是一道模拟题,给了地图范围,就先建一个二维数组. 既然是轰炸求炸了几轮还有最后一次什么时候炸的,那就每次炸就存一下就好了呗.数据水,就两个二维数组啊,一个用于 ...

  9. 求最小连续和(洛谷P1614题题解,Java语言描述)

    题目要求 P1614题目链接 分析 既然是要求最小连续和,那就需要存储连续的M个数据,还需要保存最小的和以及当前的和. 先开循环,把M和数据读入M长度数组中,保存好数据,完成求和. 接下来就是后续处理 ...

最新文章

  1. Markdown介绍
  2. x264各个版本下载
  3. 华为云部署html网页,手把手教你如何在华为云服务器上部署一个自己的弹幕网站!...
  4. 搜索引擎设计实用教程(3)-以百度为例
  5. lightoj 1214
  6. pmp 成本估算准确高_如何更准确地估算JavaScript中文章的阅读时间
  7. 谷歌Chrome浏览器正式上新Android版黑暗模式
  8. oracle outln用户,Oracle用户解锁
  9. Java笔记-使用BindingResult把表单错误传出来
  10. php7 断言,PHP7.2常用新特性和函数
  11. 网络爬虫相关软件以及论文检索与推荐网站调研
  12. word批量打印工具,c#写的
  13. 元旦三天假期,实现一个电商退单管理系统【二】
  14. 被互联网婚恋榨干的你,还会相信爱情吗?
  15. pms后端商品管理系统介绍
  16. MySQL B+树如何实现联合索引
  17. Java基础知识----字符串
  18. Lucene 7.5.0 索引文件之nvdnvm
  19. Python 数据处理数据挖掘(六):决策树模型 之 CART算法
  20. ios opencv图片处理_如何在 iOS 工程中使用 OpenCV?

热门文章

  1. SET FOREIGN_KEY_CHECKS命令
  2. 机器学习生物医学图像处理方向研究前景如何?
  3. 国仁老猫:“视频号”最新最全变现引流方式大全;值得收藏【下】
  4. Bio-Helix丨Bio-Helix艾美捷100bp DNA ladder说明书
  5. ECDH KDF java_java-ECDH使用Android KeyStore生成的私钥
  6. 使用美图秀秀去水印、痘痘、路人甲教程
  7. 解决SVN提交代码撤回---恢复上个版本(回滚)
  8. C语言还可以这么玩,你绝对想不到!
  9. Hive数据类型和使用注意事项详解
  10. 中国芯片行业市场十四五前景预测与供给情况分析报告2022-2027年