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

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…

【转】.htaccess 详解

.htaccess是什么 .htaccess文件(或者"分布式配置文件"&#xff09;提供了针对目录改变配置的方法&#xff0c; 即&#xff0c;在一个特定的文档目录中放置一个包含一个或多个指令的文件&#xff0c; 以作用于此目录及其所有子目录。作为用户&#xff0c;所能使用的命…

数据结构 - 单链表(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;但最终结果不变。

【转】magento性能优化的教程(非常详细)

Magento是一套专业开源的电子商务系统,Magento设计得非常灵活&#xff0c;具有模块化架构体系和丰富的功能但有朋友会发现此模块用到了会发现非常的缓慢了&#xff0c;那么下面我们来看关于magento性能优化的例子。 前面优化 mod_deflate模块&#xff0c;将text、 css 和 jav…

java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点

// 1.获取到单链表的节点的个数&#xff08;如果有头结点&#xff0c;不统计头结点&#xff09;public static int getLength(HeroNode head){if (head.next null){return 0;}int length 0;//定义一个辅助变量&#xff0c;HeroNode cur head.next;while(cur !null){length;c…

php国密sm4

加解密代码摘自网络&#xff0c;出处忘记了&#xff0c;这里就不附链接&#xff0c;对原创说声抱歉&#xff01; 先附上代码&#xff1a; <?phpClass SM4Util {public $SM4_CK [0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc…

【转】可道云kodexplorer搭建私有云后的配置优化

一、上传下载速度优化 首先明确可道云没有对上传下载做任何限制&#xff0c;速度快慢和网络环境有关。可道云是基于http上传&#xff0c;所以和其他http上传速度基本一致&#xff1b;可以对比其他web系统或网站说附件上传速度。同其他例如webdav、FTP、QQ传输等软件底层协议不一…

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…

数据结构 - 单链表(百度面试题单链表的倒序打印)

方法1&#xff1a;反转打印&#xff08;但是会改变链表结构&#xff0c;不建议&#xff09; https://blog.csdn.net/weixin_43736084/article/details/101939789 方法2&#xff1a;存入栈中&#xff0c;在出栈 public static void reversePrint(HeroNode head){if (head.next…

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

程序里有几个注释的地方还是需要特别注意的&#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;是…

数据结构 - 栈(链表实现栈的入栈出栈)

学完链表和栈&#xff0c;数组模拟栈学完后&#xff0c;自己根据链表写了个链栈&#xff0c;虽然只是简单的实现了入栈出栈遍历。收获还是很大的。 在push这里思考了一会&#xff0c;思路是&#xff1a;传入一个数字&#xff0c;push里创建一个节点node&#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…

【转】什么是staging server

原文链接&#xff1a;http://blog.csdn.net/blade2001/article/details/7194895 软件应用开发的经典模型有这样几个环境&#xff1a;开发环境(development)、集成环境(integration)、测试环境(testing)、QA验证&#xff0c;模拟环境(staging)、生产环境(production)。 通常一个…

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

数组模拟栈操作 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…