(数据结构与算法)数组模拟队列和环形队列
文章目录
- 数组模拟队列
- 思路
- 代码实现
- 问题分析并优化
- 数组模拟环形队列
- 思路
- 代码实现
数组模拟队列
- 队列是一个有序列表,可以用数组或是链表来实现。
- 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出
- 示意图: (使用数组模拟队列示意图)
思路
- maxSize为队列最大容量
- front和rear记录队列前后端的下标
- front随着队列输出而改变,rear随着队列输入而改变
- 当front = rear时,队列为空
- 当rear = maxSize -1 时,队列满
代码实现
public class Demo02ArrayQueue {public static void main(String[] args) {//测试//创建一个队列ArrayQueue queue = new ArrayQueue(3);//设置队列最大值为3boolean flag = true;char key = ' ';//用于接收输入字符Scanner scanner = new Scanner(System.in);while (flag){System.out.println("请输入相应的命令操作队列");System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列中取出数据");System.out.println("h(head):查看队列头的数据");key= scanner.next().charAt(0);switch (key){case 's':queue.showQueue();break;case 'e':flag=false;break;case 'a':System.out.println("输入一个数:");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.println("被取出的数据是"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try {queue.showHead();}catch (Exception e){System.out.println(e.getMessage());}break;}}}
}
//使用数组模拟队列,编写一个ArrayQueue类
class ArrayQueue{private int maxSize;//队列最大值private int font;//队列头,指向队列头数据的前一个位置private int rear;//队列尾,指向队列尾数据本身下标private int[] arr;//存放队列的数组public ArrayQueue() {}public ArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];font=-1;rear=-1;}//判断队列是否满public boolean isFull(){return rear == maxSize-1;}//判断队列是否为空public boolean isEmpty(){return rear == font;}//添加数据到队列,n为添加的数据public void addQueue( int n){if (isFull()){System.out.println("队列已满,无法添加数据到队列");}else {rear++;arr[rear] = n;}}//从队列中取出数据public int getQueue(){if (isEmpty()){//抛出异常throw new RuntimeException("队列空,不能取出数据");}else {font++;//返回被取出的数据return arr[font];}}//显示队列public void showQueue(){if (isEmpty()){System.out.println("队列为空!");}else {//font为队头的前一个下标,所以font+1就是头数据的下标for (int i = font+1; i <rear+1 ; i++) {System.out.println(arr[i]);}}}public void showHead(){if (isEmpty()){throw new RuntimeException("队列空,不能取出数据");}else {System.out.println("队列头数据为"+arr[font+1]);}}
}
问题分析并优化
- 数组使用一次就不能用了,没有达到复用的效果
- 将这个数组使用算法,改进成一个环形队列,取模:%
数组模拟环形队列
思路
对前面的数组模拟队列的优化,充分利用数组.因此将数组看做是一个环形的。(通过取模的方式来实现即可)
注意点:
- front表示队列头本身下标,rear表示队列尾下一个数据的下标,初始值都为0
- (rear+1)%maxSize == front判断队列是否已满
- 添加元素 rear=(rear+1)%maxSize,防止下标越界 任何数取余不会超过除数。获取元素也一样。
- size()返回队列中有效数据的个数 (rear+maxSize - front)%maxSize,+maxSize使rear-front不会为负数
- 遍历时 i%maixsize 不会越界
代码实现
public class Demo03CircleArrayQueue {public static void main(String[] args) {//测试//创建一个队列CircleArrayQueue queue = new CircleArrayQueue(4);//设置队列最大值为3boolean flag = true;char key = ' ';//用于接收输入字符Scanner scanner = new Scanner(System.in);while (flag){System.out.println("请输入相应的命令操作队列");System.out.println("s(show):显示队列");System.out.println("e(exit):退出程序");System.out.println("a(add):添加数据到队列");System.out.println("g(get):从队列中取出数据");System.out.println("h(head):查看队列头的数据");key= scanner.next().charAt(0);switch (key){case 's':queue.showQueue();break;case 'e':flag=false;break;case 'a':System.out.println("输入一个数:");int value = scanner.nextInt();queue.addQueue(value);break;case 'g':try {int res = queue.getQueue();System.out.println("被取出的数据是"+res);}catch (Exception e){System.out.println(e.getMessage());}break;case 'h':try {queue.showHead();}catch (Exception e){System.out.println(e.getMessage());}break;}}}
}//使用数组模拟队列,编写一个ArrayQueue类
class CircleArrayQueue{private int maxSize;//队列最大值private int font;//队列头,默认为0,指向队列头数据的下标private int rear;//队列尾,默认为0,指向队列尾数据的后一个数据的下标private int[] arr;//存放队列的数组public CircleArrayQueue() {}public CircleArrayQueue(int maxSize) {this.maxSize = maxSize;arr = new int[maxSize];}//判断队列是否满public boolean isFull(){return (rear+1)%maxSize==font;}//判断队列是否为空public boolean isEmpty(){return rear == font;}//添加数据到队列,n为添加的数据public void addQueue( int n){if (isFull()){System.out.println("队列已满,无法添加数据到队列");}else {arr[rear] = n;//防止rear越界,任何数取余不会超过除数。//将rear后移rear = (rear+1)%maxSize;}}//从队列中取出数据public int getQueue(){if (isEmpty()){//抛出异常throw new RuntimeException("队列空,不能取出数据");}else {int value = arr[font];//防止font越界,任何数取余不会超过除数。//将font后移font = (font+1)%maxSize;//返回被取出的数据return value;}}//显示队列public void showQueue(){if (isEmpty()){System.out.println("队列为空!");}else {//font为队头的前一个下标,所以font+1就是头数据的下标for (int i = font; i <size() ; i++) {//防止i%maxSize下标越界System.out.println(arr[i%maxSize]);}}}public int size(){return (rear+maxSize-font)%maxSize;}public void showHead(){if (isEmpty()){throw new RuntimeException("队列空,不能取出数据");}else {System.out.println("队列头数据为"+arr[font]);}}
}
(数据结构与算法)数组模拟队列和环形队列相关推荐
- 【Java数据结构与算法】Java如何实现环形队列
用Java如何实现环形队列 1. 数组模拟队列的问题 数组使用一次就不能用,没有达到复用的效果. 2. 思路一 初始位置: front 和 rear 都在 -1. front 指向队列第一个元素的前一 ...
- java 二维链表_Java数据结构与算法----数组与链表
数据类型 1 数据类型介绍 数据类型的分类(按照结构划分):线性结构和非线性结构 线性结构:线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系 线性结构有两种不同的存储结构,即顺序 ...
- php环行队列实现,java数组实现队列及环形队列实现过程解析
这篇文章主要介绍了java数组实现队列及环形队列实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 代码内容 ArrayQueue---用数 ...
- 【数据结构】队列、环形队列
目录 1.队列的概念及结构 2.队列的实现 3.队列的相关实现函数与源代码 3.1初始化队列 3.2 队尾入队列 3.3 队头出队列 3.4获取队列头部元素 3.5 获取队列队尾元素 3.6 获取队列 ...
- JavaScript数据结构与算法——数组详解(下)
1.二维与多维数组 JavaScript只支持一维数组,但是通过在数组里保存数组元素的方式,可以轻松创建多维数组. 1.1 创建二维数组 二维数组类似一种由行和列构成的数组表格,在JavaScript ...
- c语言编写队列元素逆置,数据结构与算法实验—利用栈逆置队列元素.doc
数据结构与算法实验-利用栈逆置队列元素 利用栈逆置队列元素实验报告 通信1204班 谢崇赟 实验名称 利用堆栈将队列中的元素逆置 实验目的 会定义顺序栈和链栈的结点类型. 掌握栈的插入和删除结点在操作 ...
- 队列——普通队列和环形队列
队列 定义:由一个长度固定的数组和两个指针所组成的数据结构,先进先出. 功能:add delete list 实现逻辑:由组成队列的数组自身是不变化的,指针是一个表示数组下标,而且不断变化的一个数.由 ...
- 队列与环形队列使用数组模拟
队列 该文是观看尚硅谷韩老师视频学习自己总结学习得,有的是来源于网络收集 队列引入 进的一端称为队尾(rear),出的一端称为队头(front).队列可以用顺序存储,也可以用链式存储. 队列介绍 队列 ...
- 数据结构与算法学习笔记之先进先出的队列
前言 队列是一种非常实用的数据结构,类似于生活中发排队,可应用于生活,开发中各个方面,比如共享打印机(先请求先打印),消息队列.你想知道他们是怎么工作的么.那就来一起学习一下队列吧 正文 一.队列的定 ...
最新文章
- Python web 项目的依赖管理工具
- nginx的502问题
- 牛客网(剑指offer) 第七题 斐波那契数列
- 中考新大纲:初中数学无非就这26个考点!孩子吃透,再笨也能考115分!
- Centos安装NFS服务器配置及挂载教程
- python万年历_python万年历
- ap 目标检测算法map_目标检测mAP怎么计算
- 利用可道云kodexplorer一键部署私有云!路由器免费变NAS!
- Win7批量离线更新补丁方法
- 淘宝/天猫买家信息 API
- 基于jQuery的图片懒加载插件
- 【软路由安装(PVE+ikuai)】
- js获取PC设备信息,js获取手机设备信息,最全
- 联想m920t装红旗linux中SPik,联想ThinkCentre M920t台式机装win10系统及bios设置(uefi+gpt)...
- AUTOSAR MCAL CAN Driver 接口函数
- java word 题目导入_Java导入导出Excel和Word
- Linux 启动定时任务配置
- 我如何在咨询项目中使用Vagrant和Docker
- 如何使用 JavaScript 创建水平和垂直标签?
- Vue过滤器的几种用法