整个代码在文章最后面,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数据结构与算法)相关推荐

  1. 尚硅谷java数据结构与算法 韩顺平 数组实现队列问题

    day2学习打卡:数组实现循环队列 package queue;import java.util.Scanner; //这里没有使用循环队列的思想所以造成了数组空间的浪费(数组空间不能复用) publ ...

  2. Java 数据结构与算法 (尚硅谷Java数据结构与算法)笔记目录

    红色的表示重要,绿色的表示暂时还不懂而且很重要 线性结构和非线性结构 队列 顺序队列 循环队列 链表 链表(Linked List)介绍 链表是有序的列表,但是它在内存中是存储如下 小结: 1) 链表 ...

  3. 刚从阿里、头条面试回来,尚硅谷java数据结构与算法百度云

    二.回顾整理阿里面试题 基本就这样了,还有一些零星的问题想不起来了,答案也整理出来了. 自我介绍 JVM如何加载一个类的过程,双亲委派模型中有哪些方法? HashMap如何实现的? HashMap和C ...

  4. 尚硅谷Java数据结构与算法——054 冒泡排序

    冒泡排序 代码实现 package com.atguigu.sort;import java.util.Arrays;/*** @author WHT* @create 2021-06-15 11:1 ...

  5. 尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业01

    尚硅谷Java数据结构和java算法,韩顺平数据结构和算法课后作业第一题 要求: 1)在前面的基础上,将稀疏数组保存到磁盘上,比如map.data 2) 恢复原来的数组时,读取map.data进行恢复 ...

  6. 尚硅谷01 数据结构与算法_数据结构与算法介绍+稀疏数组

    数据结构与算法的关系 几个实际编程中遇到的问题 要想写出优秀的算法,首先应该能读懂别人写好的算法. 将生活中遇到的实际问题,使用程序来解决 线性结构和非线性结构 线性结构和非线性结构的关系: 数据结构 ...

  7. 尚硅谷Java数据结构与java算法 全194章笔记整理

    前言 视频地址:https://www.bilibili.com/video/BV1E4411H73v?from=search&seid=13120683720695451628 评价:整个教 ...

  8. 有序数组二分查找java_详解Java数据结构和算法(有序数组和二分查找)

    一.概述 有序数组中常常用到二分查找,能提高查找的速度.今天,我们用顺序查找和二分查找实现数组的增删改查. 二.有序数组的优缺点 优点:查找速度比无序数组快多了 缺点:插入时要按排序方式把后面的数据进 ...

  9. Java数据结构与算法学习 目前30170字

    文章借鉴于[尚硅谷]数据结构与算法(Java数据结构与算法),在内容方面会做更改,但是核心依然是他们的学习视频.在这里声明. 1. 线性结构和非线性结构 1.1 线性结构 数据结构包括两大部分,一个叫 ...

最新文章

  1. ASP.NET在IE10中Form表单身份验证失效问题解决方法
  2. P6 根轨迹分析法-《Matlab/Simulink与控制系统仿真》程序指令总结
  3. linux qt 5移植,Qt 5.13支持处理Lottie文件,可以方便地进行移植
  4. sql server关闭存储过程中未提交的事务
  5. leetcode 40. 组合总和 II 思考分析
  6. 作者:吴甘沙,男,现任英特尔中国研究院院长。
  7. CEF3—在网页加载前给js对象填值
  8. spikingjelly的20201221版本跑通ANN2SNN
  9. GoogLeNetV1,V2,V3
  10. AngularJs(Part 3)--注册服务
  11. 数学建模之斯皮尔曼相关系数的假设检验
  12. 一款非常优秀的内存数据库——lmdb
  13. 基于电气火灾监控系统与物联网的设计与研究
  14. 牛牛现在有n张扑克牌-字符串
  15. 数字藏品:传承优秀传统文化的新载体
  16. 什么是功率因数补偿/校正
  17. nxp的bluetooth驱动调试
  18. 参加计算机培训典型材料,计算机应用专业典型学员事迹材料
  19. matlab 在二次函数图像,二次函数图像(二次函数图像图片)
  20. GBK编码和UTF-8编码的区别

热门文章

  1. 北大青鸟教员工资_成为代码学校教员需要什么
  2. 欧盟宣布建立COVID-19数据共享平台以对抗新冠病毒
  3. 电脑版剪映怎么添加背景
  4. java中修改Excel表格内容
  5. 解决(gedit:27306): IBUS-WARNING **: 21:20:05.822: The owner of /home/q/.config/ibus/bus is not root!
  6. appassembler-maven-plugin 遇到的问题
  7. pcie虚拟网卡实现的几种方案
  8. 126disk网盘sql注入漏洞
  9. 利用Wireshark抓取QQ的数据流
  10. JavaScript 函数 双色球