数据结构 - 队列(非环形队列,以及优化成环形队列)
1)队列的定义与实现形式-方式
2)队列实现思路(非环形,下面进行优化)
3)代码实现(注意并不是环形)
package DataStructures.queue;import java.util.Scanner;/*** 使用数组模拟队列*/
public class ArrayQueueDemo {public static void main(String []args){//测试//创建一个队列ArrayQueue arrayQueue = new ArrayQueue(3);char key = ' '; //接收用户输入Scanner scanner = new Scanner(System.in);boolean loop = true;while(loop){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); //接收一个字符System.out.println("=========================");switch (key){case 's':arrayQueue.showQueue();break;case 'a':System.out.println("输入一个数");int value = scanner.nextInt();arrayQueue.addQueue(value);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;case 'e'://退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~~~~");}
}//队列类
class ArrayQueue{private int maxSize; //数组的最大容量private int front; //队列头private int rear; //队列尾private int[] arr; //用于存放数据的队列数组//创建队列构造器public ArrayQueue(int arrMaxSize){maxSize = arrMaxSize;arr = new int[maxSize];front = -1; //指向队列头部,分析出front指向队列头的前一个位置rear = -1; //指向队列尾部,指向队列尾的数据(即就是队列的最后一个数据)}//判断队列是否满public boolean isFull(){return rear == maxSize - 1;}//判断队列是否为空public boolean isEmpty(){return rear == front;}//添加数据public void addQueue(int n){if (isFull()){System.out.println("队列已满,不能加入");return;}rear++; //让rear后移arr[rear] = n;System.out.println("添加成功");}//获取队列数据,出队列public int getQueue(){if (isEmpty()){//通过抛出异常出来throw new RuntimeException("队列为空,不能取数据");}front ++;return arr[front];}//显示队列的所有数据public void showQueue(){//遍历if (isEmpty()){System.out.println("队列为空");return;}for (int i = 0; i < maxSize;i++){System.out.println("arr["+i+"] = "+arr[i]);}}//显示队列的头数据public int headQueue(){if (isEmpty()){throw new RuntimeException("队列为空");}return arr[front+1];}
}
上面代码实现完成后运行,会发现添加输入后取出,取出的位置不能再进行添加了,也就是添加完取出就不能再用了,没达到复用的效果
4)所以下面进行优化(改进成环形数组,取模来实现)
ps:这里最后有效数据个数,把他啊想象成一个环形,有可能rear在前有可能front在前,括号里加一个maxSize是防止rear在front后面形成负数,然后取模。
package DataStructures.queue;import java.util.Scanner;/*** 使用数组模拟队列*/public class CircleArrayQueueDemo {public static void main(String []args){//测试//创建一个队列CircleArrayQueue arrayQueue = new CircleArrayQueue(4);System.out.println("测试数组模拟环形队列");char key = ' '; //接收用户输入Scanner scanner = new Scanner(System.in);boolean loop = true;while(loop){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); //接收一个字符System.out.println("=========================");switch (key){case 's':arrayQueue.showQueue();break;case 'a':System.out.println("输入一个数");int value = scanner.nextInt();arrayQueue.addQueue(value);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;case 'e'://退出scanner.close();loop = false;break;default:break;}}System.out.println("程序退出~~~~~");}
}class CircleArrayQueue{private int maxSize; //数组的最大容量//指向队列头部,就指向队列的第一个元素,// arr[front]就是队列的第一个元素,front初值为0private int front;private int rear; //队列尾private int[] arr; //用于存放数据的队列数组//创建队列构造器public CircleArrayQueue(int arrMaxSize){maxSize = arrMaxSize; //表示数组最大容量arr = new int[maxSize];front = 0;rear = 0; //指向队列尾部,指向队列尾的数据(即就是队列的最后一个数据)}//判断队列是否满public boolean isFull(){return (rear+1)%maxSize == front;}//判断队列是否为空public boolean isEmpty(){return rear == front;}//添加数据public void addQueue(int n){//是否为空if (isFull()){System.out.println("队列已满,不能加入");return;}//直接将数据加入arr[rear] = n;//将rear后移,这里必须考虑取模rear = (rear+1) % maxSize;System.out.println("添加成功");}//获取队列数据,出队列public int getQueue(){//是否为空if (isEmpty()){//通过抛出异常出来throw new RuntimeException("队列为空,不能取数据");}//这里需要分析出front是指向队列的第一个元素// 1.先把front对应的值保存到临时变量// 2.将front 后移// 3.返回临时变量int value = arr[front];front = (front+1) % maxSize;return value;}//显示队列的所有数据public void showQueue(){if (isEmpty()){System.out.println("队列为空");return;}//遍历,从front开始变量,遍历多少个元素for (int i = front; i < front + size();i++){System.out.println("arr["+ i%maxSize +"] = "+arr[i%maxSize]);}}//求出当前队列有效数据的个数public int size(){return (rear + maxSize - front) % maxSize;}//显示队列的头数据public int headQueue(){if (isEmpty()){throw new RuntimeException("队列为空");}return arr[front];}
}
数据结构 - 队列(非环形队列,以及优化成环形队列)相关推荐
- 常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构)
常见数据结构和算法实现(排序/查找/数组/链表/栈/队列/树/递归/海量数据处理/图/位图/Java版数据结构) 数据结构和算法作为程序员的基本功,一定得稳扎稳打的学习,我们常见的框架底层就是各类数据 ...
- 【Java数据结构与算法】第一章 稀疏数组和队列
第一章 稀疏数组和队列 文章目录 第一章 稀疏数组和队列 一.线性结构和非线性结构 1.线性结构 2.非线性结构 二.稀疏数组 三.队列 1.队列 2.环形队列 一.线性结构和非线性结构 1.线性结构 ...
- python数据结构和算法 时间复杂度分析 乱序单词检测 线性数据结构 栈stack 字符匹配 表达式求值 queue队列 链表 递归 动态规划 排序和搜索 树 图
python数据结构和算法 参考 本文github 计算机科学是解决问题的研究.计算机科学使用抽象作为表示过程和数据的工具.抽象的数据类型允许程序员通过隐藏数据的细节来管理问题领域的复杂性.Pytho ...
- 数据结构复习-基础、线性表、栈、队列、串
数据结构复习笔记 作者: 收集于网络 第一章:概论 数据:指所有能被输入到计算机中,且能够被计算机识别.存储和加工处理的信息的载体,是计算机操作的对象的总称. 数据元素:数据的基本单位,有时一个数据元 ...
- 数据结构(八) -- C语言版 -- 栈和队列 - 队列的设计与实现
我让你知道我有啥 零.读前说明 一.队列的概述 二.队列的操作 三.队列的两种存储结构的模型概述 四.顺序存储结构的队列及实现 4.1.顺序存储结构的传统队列简易实现与测试 4.2.顺序存储结构的队列 ...
- 学习JavaScript数据结构与算法(一):栈与队列
本系列的第一篇文章: 学习JavaScript数据结构与算法(一),栈与队列 第二篇文章:学习JavaScript数据结构与算法(二):链表 第三篇文章:学习JavaScript数据结构与算法(三): ...
- python中栈的描述是_数据结构与算法:Python语言描述 栈和队列.ppt
数据结构与算法:Python语言描述 栈和队列 迷宫问题 迷宫问题的特点: 存在一集可能位置,一些位置相互连通,一步可达 一个位置可能连通若干位置,出现向前探查的多种可能(有分支) 目标是找到一条路径 ...
- java lazy_Java性能优化要点之五: 队列与lazySet
Java性能优化要点之五: 队列与lazySet 队列需要对正确的应用使用好正确的队列Queue,否则会产生性能问题,队列分生产者和消费者,或者发布者订阅者,它们之间有一对多和多对多以及多对一等关系. ...
- 两顺序栈共享Java_数据结构与算法(三),栈与队列
上一篇<数据结构与算法(二),线性表>中介绍了数据结构中线性表的两种不同实现--顺序表与链表.这一篇主要介绍线性表中比较特殊的两种数据结构--栈与队列.首先必须明确一点,栈和队列都是线性表 ...
最新文章
- UVA11019KMP(二维矩阵匹配出现次数)
- c语言输入十个英文国名,c语言程式设计 在主函式输入10个字元,用子函式求出共输入几个英文字元,几个数字字元,几个符号%...
- What means the error-message 'java.lang.OutOfMemoryError: GC overhead limit exceeded' in Java?
- .Net 中的封装知识点
- 软件测试行业用mac好还是win好,业余RMAA测试 同样的硬件下OS X果然比Windows声音好...
- 聊聊redo log是什么?
- app启动监听网络类型
- 得存一波板子了。。。。
- linux 系统信号忽略和system函数返回值问题(system的实现)
- no cortex-m sw device found 问题解决及JLINK下载Hex程序
- 华为手机fastboot解锁
- android高效模拟器,51模拟器
- tempo js渲染引擎
- install -save 和 -save-dev区别
- ssm+java计算机毕业设计英雄联盟俱乐部管理系统j4oh6(程序+lw+源码+远程部署)
- HZNU Training 4 for Zhejiang Provincial Collegiate Programming Contest 2019
- win10能上网显示无法连接服务器,电脑不能联网怎么办 Win10无法连接网络解决方法...
- linux笔记(第三周)
- Django框架之美多商城项目
- 家庭宽带真的还有意义么?
热门文章
- C#链接mysql 新手容易出错的问题
- 小米范工具系列之二:小米范 web目录扫描器
- string.Format 指定字符串宽度
- IPv6 相关的工作简介
- MemDC,GDI绘制注意点
- html网页距离顶部50像素,HTML5 教程之CSS Padding(填充)
- mysql命令_MySQL常用操作命令
- 有关计算机组成原理知识的论文,关于计算机组成原理的论文_计算机组成原理_图灵机的组成...
- document.addeventlistener方法不执行_JUnit 5 测试方法的执行优先级
- 北大计算机科学与技术专业河南录取分数线,北京大学河南录取分数线|2021北京大学河南分数线|2021年北京大学河南高考分数线|2021年北京大学河南招生计划录取人数...