用数组实现环形队列(尚硅谷Java数据结构与算法)
整个代码在文章最后面,gitee地址:java数据结构与算法: 自己学习与练习数据结构的仓库https://gitee.com/ALi_L/javaDataStructurs.git
环形队列的难点如下:
1.如何判断队列已经满了
2.如何判断队列是空的
3.如何打印队列
4.如何增加一个元素到队列
解决方法:
首先用front指向队列的首元素地址,用rear指向队列最后一个元素后面的地址,队列的属性如下:。
private int maxSize;private int front;//从0开始,指向数组的第一个元素private int rear;//从0开始,指向数组最后一个元素的后一个元素private int[] array;
如果队列的长度为4,则队列最多存储3个元素,最后一个位置空出来作为一个保留空间,也就是说当队列满时还有一个空闲单元。
1.如何判断队列已经满:
由于rear可能比front大,也可能小,所以当rear在front左边一个位置相当于队列是满的了。如下图所示就是队列满了:
队列最大尺寸为maxSize,那么队列满的条件是(rear+1)% maxSize == front;由上图就可以看出rear+1刚好是front的位置,但是其大小可能比front大,因此用模运算,可以将rear控制在[0,maxSize]之间,而且front的大小也在[0,maxSize]之间,借住上面公式就可以判断队列是否满了!
2.如何判断队列为空:
只要front == rear 就表示队列为空。
3.如何打印队列
/*** 显示队列的所有数据*/public void showQueueAllData(){if(isEmpty()){System.out.println("队列为空");return;}System.out.println("队列所有的数据如下:");for (int i = front;i < front+size();i++){System.out.printf("array[%d] = %d\n",i%maxSize,array[i%maxSize]);//格式化打印}}/*** 计算队列的个数*/public int size(){return (rear+maxSize-front)%maxSize;}
打印的起始下标为front,要打印的终止下标不能为rear,如果出现下图现象就出错了。
因此打印次数应该是队列元素的个数,求队列元素的个数用了size()方法。
size()方法的精髓是将队列分为两部分,一部分是rear前的元素个数,一部分是front后的元素个数,这两部分相加就是队列的总元素个数,可以看上图理解下。rear前的元素个数=rear+0;
front后的元素个数=maxSize-front;二者想加就是队列的元素总个数。
取数组元素时下标不能用i;要用i%maxSize,因为数组下标是[0,maxSiz-1];
4.如何增加一个元素到队列
/*** 添加数据到队列* @param number 新加的数据*/public void addQueue(int number){if (isFull()){//抛异常处理throw new RuntimeException("队列已经满了,不能添加了!");}//与数组队不一样array[rear] = number;rear = (rear + 1)%maxSize;}
rear是指向最后一个元素的后一个元素,所以array[rear]是空的,可以直接新增,然后将rear+1;在将其取模控制在[0,maxSize-1];
整个代码:
CircleArrayDemo是测试类,CircelArray是环形队列类
package DataStructures;import java.util.Scanner;/*** @author :ALi* @date :Created in 2021/9/12 15:06* @description:用循环数组来实现队列* @modified By:* @version: 尚硅谷java数据结构与算法$*/
public class CircleArrayDemo {public static void main(String[] args) {//初始化队列CircelArray queue = new CircelArray(4);//接收用户输入char key = ' ';//循环时用的boolean loop = true;//标准输入Scanner scanner = new Scanner(System.in);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);//接收输入的第一个字符switch (key) {case 's':queue.showQueueAllData();break;case 'e':scanner.close();loop = false;break;case 'a':try {System.out.println("请输入要添加的数据:");int data = scanner.nextInt();queue.addQueue(data);} catch (Exception e) {System.out.println(e.getMessage());}break;case 'g':try {int res = queue.getQueue();System.out.printf("取出的数据为:%d\n", res);} catch (Exception e) {System.out.println(e.getMessage());//抛的异常为getQueue中的RuntimeException}break;case 'h':try {int res = queue.showFront();System.out.printf("头数据为:%d\n", res);} catch (Exception e) {System.out.println(e.getMessage());}break;default:break;}}System.out.println("程序退出!");}}/*** 循环数组实现队列类*/
class CircelArray{private int maxSize;private int front;//从0开始,指向数组的第一个元素private int rear;//从0开始,指向数组最后一个元素的后一个元素private int[] array;/*** 构造方法*/public CircelArray(int number){maxSize = number;front = 0;rear = 0;array = new int[maxSize];}/*** 判断队列是否满了* @return true:满了*/public boolean isFull(){// return rear == MaxLength-1;//这个是没用循环的数组return (rear+1)%maxSize == front;}/*** 判断队列为空* @return true:空*/public boolean isEmpty(){// return front == rear;//头尾相等为空//这个是没用循环的数组return front == rear;}/*** 添加数据到队列* @param number 新加的数据*/public void addQueue(int number){if (isFull()){//抛异常处理throw new RuntimeException("队列已经满了,不能添加了!");}//与数组队不一样array[rear] = number;rear = (rear + 1)%maxSize;}/*** 取队列的数据(出队列)* @return 队列首部的元素*/public int getQueue(){if(isEmpty()){//抛异常处理throw new RuntimeException("队列空,无法取数据");}//很容易出错int res = array[front];front = (front + 1) % maxSize;return res;}/*** 显示队列的所有数据*/public void showQueueAllData(){if(isEmpty()){System.out.println("队列为空");return;}System.out.println("队列所有的数据如下:");for (int i = front;i < front+size();i++){System.out.printf("array[%d] = %d\n",i%maxSize,array[i%maxSize]);//格式化打印}}/*** 计算队列的个数*/public int size(){return (rear+maxSize-front)%maxSize;}/*** 显示头数据*/public int showFront(){if(isEmpty()){throw new RuntimeException("数列为空,没有头数据!");}return array[front];}}
用数组实现环形队列(尚硅谷Java数据结构与算法)相关推荐
- 尚硅谷java数据结构与算法 韩顺平 数组实现队列问题
day2学习打卡:数组实现循环队列 package queue;import java.util.Scanner; //这里没有使用循环队列的思想所以造成了数组空间的浪费(数组空间不能复用) publ ...
- Java 数据结构与算法 (尚硅谷Java数据结构与算法)笔记目录
红色的表示重要,绿色的表示暂时还不懂而且很重要 线性结构和非线性结构 队列 顺序队列 循环队列 链表 链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 1) 链表 ...
- 刚从阿里、头条面试回来,尚硅谷java数据结构与算法百度云
二.回顾整理阿里面试题 基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了. 自我介绍 JVM如何加载一个类的过程,双亲委派模型中有哪些方法? HashMap如何实现的? HashMap和C ...
- 尚硅谷Java数据结构与算法——054 冒泡排序
冒泡排序 代码实现 package com.atguigu.sort;import java.util.Arrays;/*** @author WHT* @create 2021-06-15 11:1 ...
- 尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业01
尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业第一题 要求: 1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data 2) 恢复原来的数组时,读取map.data进行恢复 ...
- 尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组
数据结构与算法的关系 几个实际编程中遇到的问题 要想写出优秀的算法,首先应该能读懂别人写好的算法. 将生活中遇到的实际问题,使用程序来解决 线性结构和非线性结构 线性结构和非线性结构的关系: 数据结构 ...
- 尚硅谷Java数据结构与java算法 全194章笔记整理
前言 视频地址:https://www.bilibili.com/video/BV1E4411H73v?from=search&seid=13120683720695451628 评价:整个教 ...
- 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)
一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...
- Java数据结构与算法学习 目前30170字
文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...
最新文章
- ASP.NET在IE10中Form表单身份验证失效问题解决方法
- P6 根轨迹分析法-《Matlab/Simulink与控制系统仿真》程序指令总结
- linux qt 5移植,Qt 5.13支持处理Lottie文件,可以方便地进行移植
- sql server关闭存储过程中未提交的事务
- leetcode 40. 组合总和 II 思考分析
- 作者:吴甘沙,男,现任英特尔中国研究院院长。
- CEF3—在网页加载前给js对象填值
- spikingjelly的20201221版本跑通ANN2SNN
- GoogLeNetV1,V2,V3
- AngularJs(Part 3)--注册服务
- 数学建模之斯皮尔曼相关系数的假设检验
- 一款非常优秀的内存数据库——lmdb
- 基于电气火灾监控系统与物联网的设计与研究
- 牛牛现在有n张扑克牌-字符串
- 数字藏品:传承优秀传统文化的新载体
- 什么是功率因数补偿/校正
- nxp的bluetooth驱动调试
- 参加计算机培训典型材料,计算机应用专业典型学员事迹材料
- matlab 在二次函数图像,二次函数图像(二次函数图像图片)
- GBK编码和UTF-8编码的区别
热门文章
- 北大青鸟教员工资_成为代码学校教员需要什么
- 欧盟宣布建立COVID-19数据共享平台以对抗新冠病毒
- 电脑版剪映怎么添加背景
- java中修改Excel表格内容
- 解决(gedit:27306): IBUS-WARNING **: 21:20:05.822: The owner of /home/q/.config/ibus/bus is not root!
- appassembler-maven-plugin 遇到的问题
- pcie虚拟网卡实现的几种方案
- 126disk网盘sql注入漏洞
- 利用Wireshark抓取QQ的数据流
- JavaScript 函数 双色球