数据结构 - 队列(非环形队列,以及优化成环形队列)

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];}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437619.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬取网易云音乐歌曲特色榜单信息

网易云音乐(iframe内的歌单) 刚开始学习做下记录 需要先下载好所需浏览器内核 我时谷歌&#xff0c;下载地址 http://chromedriver.storage.googleapis.com/index.html 然后没了&#xff0c;自己F12扒拉下就行了 运行&#xff1a; 左侧随便点击一个榜单后&#xff0c;复制ur…

数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序

下面实现一个例子来进行学习 1&#xff09;介绍 单链表的逻辑结构 在内存中的实际结构 具体创建示意图&#xff1a; 2&#xff09;代码实现 例子 1。第一个程序在添加的时候并没有按照序号排序&#xff0c;如果在添加的时候把位置改变输出的时候序号会改变 package DataStr…

Mysql count() 语句

百万数据测试 select count(主键) from table 执行效率&#xff1a; select count(*) AS AGGREGATE from table 以上测试均再 navicat 工具进行 由于各种原因&#xff0c;sql执行时间可定存在一定误差&#xff0c;但最终结果不变。

phpStydy+wordpress 安装部署

1、先准备工具包 下载phpstudy&#xff0c;下载地址&#xff1a;https://www.xp.cn/ 下载wordpress &#xff0c;下载地址&#xff1a;https://cn.wordpress.org/download/ 2、安装phpStudy&#xff0c;下一步操作即可 3、安装完成后&#xff0c;检测环境配置&#xff0c;php、…

java数据结构 - 单链表(腾讯面试题实现单链表反转)

直接上实现代码 //单链表的反转public static void reverseList(HeroNode head){//如果当前链表为空&#xff0c;或只有一个节点&#xff0c;无需反转if (head.next null || head.next.next null){return ;}//定义一个辅助变量&#xff0c;帮助我们遍历HeroNode cur head.n…

数据结构 - 链表(双向链表学习)

程序里有几个注释的地方还是需要特别注意的&#xff0c;根据单链表自己的逻辑来写一遍双向链表&#xff0c;可能有几个细节处理的不到位。 package DataStructures.LinkedList;public class DoubleLinkedListDemo {public static void main(String []args){System.out.println…

【转】Mac下 如何配置虚拟机软件Parallel Desktop--超详细

Mac下 如何配置虚拟机软件Pparallel Desktop--超详细 Mac 的双系统解决方案有两种&#xff0c;一种是使用Boot Camp分区安装独立的Windows&#xff0c;一种是通过安装Parallels Desktop一类的虚拟机软件运行Windows。采用虚拟机的方式优势更明显&#xff0c;可以灵活的在两个系…

数据结构 - 链表(单向环形链表)(约瑟夫问题)

问题如下&#xff08;与分析&#xff09; 构建思路 输入一个数&#xff0c;数到这个数的小孩出圈&#xff0c;出圈顺序的思路 代码实现 根据图解&#xff0c;来一步一步实现 //根据用户输入&#xff0c;计算小孩出圈顺序/**** param startNo 表示从第几个小孩开始数数* param …

【转】什么是ERP、SCM、CRM?

ERP、SCM、CRM的区别 &#xff08;1&#xff09;从管理理念上来说&#xff0c;ERP的管理理念是提高企业内部资源的计划和控制能力&#xff0c;讲究的是在满足客户、及时交货的同时最大限度地降低各种成本&#xff0c;通过提高内部运转效率来提高对客户的服务质量&#xff0c;是…

【转】理解OAuth 2.0

作者&#xff1a; 阮一峰 日期&#xff1a; 2014年5月12日 OAuth是一个关于授权&#xff08;authorization&#xff09;的开放网络标准&#xff0c;在全世界得到广泛应用&#xff0c;目前的版本是2.0版。 本文对OAuth 2.0的设计思路和运行流程&#xff0c;做一个简明通俗的解…

数据结构- 栈(实现综合计算器)(一位数计算 扩展到 多位数计算)

思路 代码&#xff08;可以看到这里的数字只能是单位数字&#xff0c;那么如何改成可以是多位数呢&#xff1f;&#xff01;往下看&#xff09; package stack;public class Calculator {public static void main(String[] args) {//完成表达式运算String expression "7…

数据结构 - 栈(数组模拟栈操作)

数组模拟栈操作 package stack;import java.util.Scanner;public class ArrayStackDemo {public static void main(String[] args) {//测试ArrayStack//创建栈ArrayStack arrayStack new ArrayStack(4);String key "";boolean loop true;Scanner sc new Scanner…

【转】visual studio 2019 (vs) 显示右侧缩略图_缩略图_滚动条

1. 工具 -> 选项 2. 文件编辑器 -> 选项对应的语言(Basic, C#, C/C....) -> 行为 -> 使用垂直滚动条的缩略图模式&#xff08;M&#xff09; 效果&#xff1a;

数据结构 - 栈 (逆波兰计算器)(栈的三种表达式)(前缀、中缀和后缀表达式,后缀也叫逆波兰表达式)(中缀表达式转后缀表达式实现步骤及完整代码)

栈的三种表达式&#xff1a;前缀、中缀和后缀表达式&#xff0c;后缀也叫逆波兰表达式 前缀&#xff08;波兰表达式&#xff09; 中缀&#xff08;对人来讲很好理解&#xff0c;对于计算机来讲就方便了&#xff0c;一般会把中缀表达式转换成后缀表达式&#xff09; 后缀&#…

数据结构与算法 - 递归回溯(迷宫问题)

递归的概念 简单说就是方法自己调用自己&#xff0c;每次调用时传入不同的变量&#xff0c;递归有助于编程者解决复杂的问题&#xff0c;同时可以让代码简介 递归的调用机制 递归能解决什么问题 递归需要遵守的重要规则 下面用代码来实现一个迷宫问题 主要代码&#xff08;这…

【转】Web Reference和Service Reference的区别

今天因为项目需要使用服务引用&#xff0c;就按之前的经验添加上了&#xff0c;步骤如下&#xff1a; 项目根目录——引用——右键——添加服务引用——高级——添加Web引用——输入接口的URL地址——回车&#xff08;下方出现的就是接口的定义的方法&#xff09;——修改Web引…

数据结构 - 递归 回溯算法(八皇后问题)

游戏地址自己写完了可以根据结果去测试一下。 算法分析 八皇后问题算法思路分析 1&#xff09;第一个皇后先放第一行第一列 2&#xff09;第二个皇后放在第二行第一列、然后判断是否OK&#xff0c; 如果不OK&#xff0c;继续放在.第二列、第三列、依次把所有列都放完&#x…

算法 - 排序算法 的时间复杂度计算

简介 度量一个程序(算法)执行时间的两种方法 1&#xff09;事后统计的方法这种方法可行, 但是有两个问题&#xff1a;一是要想对设计的算法的运行性能进行评测&#xff0c;需要实际运行该程序&#xff1b;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素, 这种方式&a…

【转】Magento2目录结构

目录结构 可以看到,M2的目录挺多的。 我们依次来讲解下, 我这里截取的是github里的源代码,核心代码跟composer和官网下载的源码包的存放路径不一样。 如果是github下载的&#xff0c;那么m2的核心源代码就在app/code/Magento里。 如果是composer安装或者官网下载的源码包&#…

算法 - 排序算法 (算法学习)(冒泡、选择、插入、希尔、快排、归并)

1&#xff09;冒泡排序 1.1 图解演示 2&#xff09;选择排序 import java.text.SimpleDateFormat; import java.util.Date;/*** 选择排序*/ public class chooseSort {public static void selectSort(int[] arr){for (int i 0; i < arr.length; i) {int minIndex i;int m…