数组模拟实现队列(Java语言描述)
队列的实例:电影院购票、排队打饭、去麦当劳买吃的,银行排队叫号等等这些场合都需要排队,生活中的各种排队现象就展示了队列的实例
队列的介绍:队列是个有序列表
队列的实现方式:
- 数组
- 链表
注意:若使用数组来模拟实现队列,就是顺序存储,若使用链表来实现队列,就是链式存储。
队列的重要原则
(或者叫做特点
):先入先出(FIFO)
,也就是说谁先进入到队列谁就会先被调出去。即:先存入队列的数据要先取出,反之,后存入队列的数据要后取出
使用数组来模拟实现队列
画图分析:
rear : 表示队尾,就是队列的尾部
front:表示对首,就是队列的头部
当把数据添加到队列中时,front的值和位置不会产生变化,而rear队尾的位置和值会随着数据的增加变化而变化。由此说明,往队列中添加数据是从队列尾部rear加,变化的是rear,而不是front
当把数据从队列中取出时,rear的值和位置不会产生变化,而front队首的位置和值会随着数据的减少变化而变化。由此说明:往队列中取出数据是从队列头部front取出的,变化的是front,而不是rear
若使用数组的结构来存储队列的数据,则数组队列的声明如下图所示:
设计队列时,首先定义个ArrayQureue
类,类中有4个属性(也叫做成员变量)分别是数组queueArr[]
、maxsize
、front
和rear
maxsize
:代表队列的最大容量,就是该队列数组最大能存储多少个数据
rear
:用来记录队列的队尾
front
:用来记录队列的队首
queueArr[]
:数组模拟实现队列,队列存的数据就是存放在数组中的。
队列的常用操作:(重要
)
- 创建队列
- 把数据添加到队列中(入队列)
- 把数据从队列从取出来(出队列)
入队列思路分析:
将入队列这个功能写成一个对应的成员方法addQueue(int n)
实现入队列需要两个步骤:
首先必须判断队列是否已满
rear == maxsize - 1
,当队尾rear = maxsize - 1
时,则说明队列已经满了,就不能实现入队列了,反之,当队尾rear != maxsize - 1 || real < maxsize - 1
时,则说明队列未满,就可实现入队列操作注意:判断队列是否满,取决于
maxsize
和rear
之间的关系画图分析:
将队尾
rear ++
,rear的位置往后移动以下,数据从队尾加入。
出队列思路分析:
将出队列这个功能写成一个对应的成员方法getQueue(int num)
实现出队列需要两个步骤:
首先判断队列是否为空
rear == front
,若队首和队尾相等了rear = front
,则证明队列是空的,就不能实现出队列的操作,若强制实现出队列,会抛出数组下标越界异常,反之,则证明队列不为空,则可实现出队列的操作。注意:判断队列是否满,取决于
front
和rear
之间的关系画图分析:
将队首
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];}
}
问题及优化:
- 目前数组使用一次就不能使用了,没有达到复用的效果
- 将这个数组使用算法改进成环形队列的数组,核心是采用取模% 来实现的
总结:
- front 始终指向的是队列头的前一个位置,不是直接指向队列中的第一个数据,始终不包含队列中的第一个数据,front所指向的存储空间中始终没有数据。当rear 和front相等 时,front不包含队列中的任何数据,因为队列是空的,也无法实现出队列操作。
rear指向队列的尾部的具体的数据,包含队列的最后一个数据。当rear 和front相等 时,rear不包含队列中的任何数据,因为队列是空的。
画图分析:
- 判断队列是否满 ,取决于
rear
和maxsize
的关系rear == maxsize - 1
- 判断队列是否为空 ,取决于
rear
和front
的关系rear == front
数组模拟实现队列(Java语言描述)相关推荐
- 队列模拟约瑟夫问题(洛谷P1996题题解,Java语言描述)
题目要求 P1996题目链接 分析 以前就研究过"约瑟夫环"问题: <单循环链表求解约瑟夫环问题(Java语言描述)> <杀人游戏~约瑟夫环(洛谷P1145题题解 ...
- 花式模拟【栈结构】做“日志分析”(洛谷P1165题题解,Java语言描述)
题目要求 P1165题目链接 分析 标准的栈结构,但使用数组来模拟会更简单. 因为对于这个问题,其实数组不需要存储真实数值,只考虑当前最大值就行了. 毕竟,出栈也不需要返回当前真实值. 另外,我们只使 ...
- 利用循环队列的思想进行加密解密(洛谷P1914题题解,Java语言描述)
前言 在我看来,理解循环队列对我们思考问题的帮助就是: 合理利用"%"的约束,将问题的"越界"重新弹回问题范围内. 本文就是一个例子,循环队列的思想为我快速秒杀 ...
- 《数据结构与抽象:Java语言描述(原书第4版)》一2.2.1 可变大小数组
本节书摘来华章计算机<数据结构与抽象:Java语言描述(原书第4版)>一书中的第2章 ,第2.2.1节,[美]弗兰克M.卡拉诺(Frank M. Carrano) 蒂莫西M.亨利(Timo ...
- Java版数据结构之数组模拟环形队列demo
Java版数据结构之数组模拟环形队列demo 我的代码仓库:https://github.com/zhuangbinan/datastructure 类 CircleArray package clu ...
- 模拟DNF放技能的蓝耗问题(洛谷P2006题题解,Java语言描述)
题目要求 P2006题目链接 分析 看来出题人喜欢DNF啊,还对蓝充足颇为渴求 (废话,没蓝干甚) -- 这题貌似水题,但AC率不高,因为有坑诶-- 首先是耗蓝为0的时候,伤害还是打的出来的(参考平A ...
- s数据结构替换子表java版_数据结构与算法分析Java语言描述(第3版) PDF和源码免费 下载...
<数据结构与算法分析Java语言描述(第3版)>PDF和源码免费 下载 免积分下载 用户下载说明: 图书简介: 数据结构:Java语言描述(原书第3版)是国外数据结构与算法分析方面的经典教 ...
- 城市大轰炸(洛谷P1830题题解,Java语言描述)
题目要求 P1830题目链接 分析 本题就是一道模拟题,给了地图范围,就先建一个二维数组. 既然是轰炸求炸了几轮还有最后一次什么时候炸的,那就每次炸就存一下就好了呗.数据水,就两个二维数组啊,一个用于 ...
- 求最小连续和(洛谷P1614题题解,Java语言描述)
题目要求 P1614题目链接 分析 既然是要求最小连续和,那就需要存储连续的M个数据,还需要保存最小的和以及当前的和. 先开循环,把M和数据读入M长度数组中,保存好数据,完成求和. 接下来就是后续处理 ...
最新文章
- Markdown介绍
- x264各个版本下载
- 华为云部署html网页,手把手教你如何在华为云服务器上部署一个自己的弹幕网站!...
- 搜索引擎设计实用教程(3)-以百度为例
- lightoj 1214
- pmp 成本估算准确高_如何更准确地估算JavaScript中文章的阅读时间
- 谷歌Chrome浏览器正式上新Android版黑暗模式
- oracle outln用户,Oracle用户解锁
- Java笔记-使用BindingResult把表单错误传出来
- php7 断言,PHP7.2常用新特性和函数
- 网络爬虫相关软件以及论文检索与推荐网站调研
- word批量打印工具,c#写的
- 元旦三天假期,实现一个电商退单管理系统【二】
- 被互联网婚恋榨干的你,还会相信爱情吗?
- pms后端商品管理系统介绍
- MySQL B+树如何实现联合索引
- Java基础知识----字符串
- Lucene 7.5.0 索引文件之nvdnvm
- Python 数据处理数据挖掘(六):决策树模型 之 CART算法
- ios opencv图片处理_如何在 iOS 工程中使用 OpenCV?
热门文章
- SET FOREIGN_KEY_CHECKS命令
- 机器学习生物医学图像处理方向研究前景如何?
- 国仁老猫:“视频号”最新最全变现引流方式大全;值得收藏【下】
- Bio-Helix丨Bio-Helix艾美捷100bp DNA ladder说明书
- ECDH KDF java_java-ECDH使用Android KeyStore生成的私钥
- 使用美图秀秀去水印、痘痘、路人甲教程
- 解决SVN提交代码撤回---恢复上个版本(回滚)
- C语言还可以这么玩,你绝对想不到!
- Hive数据类型和使用注意事项详解
- 中国芯片行业市场十四五前景预测与供给情况分析报告2022-2027年