(上一篇队列:https://www.cnblogs.com/yxm2020/p/12676323.html

1、假溢出

​ 系统作为队列用的存储区还没有满,但队列却发生了溢出,我们把这种现象称为"假溢出"。

因为队列遵从从队尾存入数据,从队头取数据,所以红框部分的空间就不能继续存入新的数据,此时队列有多余的空间,却不能存入值,这种现象就叫做假溢出现象

2、循环队列介绍

​ 充分利用了空间,解决“假溢出”的问题

【循环队列思想】

​ 将普通队列想象成逻辑上的首位相连的圆环,把这个叫循环队列,在循环队列中,当队列为空时,有front=rear,而当所有队列空间全占满时,也有front=rear。为了区别这两种情况,规定循环队列最多只能有MaxSize-1个队列元素,当循环队列中只剩下一个空存储单元时,队列就已经满了。因此,队列判空的条件是front=rear,而队列判满的条件是front=(rear+1)%MaxSize

【为什么要空一个存储单元】

​ 我有想过这个问题,rear一直是空的,我为什么不能在里面存值,而我队列判满的条件也是front=(rear+1)%MaxSize,似乎很合情合理,那么我们把目光转到开头,当我存入第一个数字的时候,队尾肯定是要加一的,如果我front,rear的初始值像普通队列那样都为-1,才不会自相矛盾,但是这是个循环队列,当第二轮的时候,这个就不管用了,所以一定要空一个存储单元。

3、Java代码实现

1、确定有哪些元素

  • 头尾标志:rear,front,并且初值都为0
  • 最大长度
  • 定义一个数组,这次我决定用泛型(泛型数组,这部分知识很有意思,建议尝试)

【代码实现】

public class CircleArrayQueue<T> {
//最大长度
private int maxSize;
//头尾标志
private int rear;
private int front;
T[] array;
public CircleArrayQueue(int maxSize,Class<T> type){
init(maxSize,type);
}
//初始化
private void init(int maxSize,Class<T> type){
//个人觉得这个是个黑盒实现,使用的人传入maxSize大小,你不应该只给他创造maxSize-1的大小
this.maxSize = maxSize+1;
rear = 0;
front = 0;
array = (T[]) Array.newInstance(type,this.maxSize);
} //判断队满
public boolean isFull(){
//rear和front的变化一定要记得是个循环,不然很容易搞错,我就搞错好多次
return (rear+1)%maxSize == front;
}
//判断队空
public boolean isEnpty(){
return rear == front;
}
//插入
public void add(T t){
if(isFull()){
throw new RuntimeException("队列已满");
}
array[rear] = t;
rear = (rear+1)%maxSize;
}
//取元素
public T get(){
if(isEnpty()){
throw new RuntimeException("队列为空");
}
T t = array[front];
front = (front+1)%maxSize;
return t;
}
//获得长度
public int size(){
return (rear+maxSize-front)%maxSize;
}
//打印所有数据
public void showData(){
int length = this.size();
int head = front;
for (int i = 0; i < length; i++) {
//先执行array[head],再自加
System.out.println(array[head]);
head = (head+1)%maxSize;
}
}
}

个人写的代码水平比较低,仅供参考。

Java数组模拟环形队列的更多相关文章

  1. 数组模拟循环队列(java实现)

    1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...

  2. Java数组模拟队列 + 优化

    队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图)  数组模拟队列 队列本身是有序列表 ...

  3. Java数组模拟队列

    队列 先进先出 什么意思呢? 我的理解:队列就是一个数组(不包含链表),然后我们给它施加一个存数据和取数据的规则 当只允许从一端存数据,从另一端取数据的数组,就是队列,我们要做的就是给这个数组施加我们 ...

  4. Java数组模拟栈

    一.概述 注意:模拟战还可以用链表 二.代码 public class ArrayStack { @Test public void test() { Stack s = new Stack(5); ...

  5. Java数组实现循环队列的两种方法

    用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...

  6. 用java数组模拟登录和注册功能

    package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...

  7. 用java数组模拟购物商城功能与实现

    实体类1(商品): package mall.model; public class goods { private int shoppingID; // 商品编号 private String sh ...

  8. 数据结构算法学习之队列(数组模拟java实现)

    数组模拟队列 数组模拟队列 今天学习数组模拟队列.队列常用于生活中的方方面面.比如银行叫号排队.实际上就是队列.所有人抽号排队.先去的先抽号.所以靠前的号最后会先被叫到然后出队.后边的会随之往前移位. ...

  9. Java 单向队列及环形队列

    队列的特点 1.可以使用数组和链表两种方式来实现. 2.遵循先入先出(FIFO)的规则,即先进入的数据先出. 3.属于有序列表. 图解实现过程: ​ 1.定义一个固定长度的数组,长度为maxSize. ...

随机推荐

  1. CentOS7 部署 Hadoop 3.2.1 (伪分布式)

    CentOS: Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 ...

  2. Python第二章-变量和数据类型

    变量和数据类型 一.什么是变量,常量 思考:程序执行指的是什么? 对数据进行存储处理和计算,最终获得结果,这是程序执行的本质. 变量的概念和在数学中的变量的概念一样的,只是在计算机程序中,变量不仅可以 ...

  3. OpenCV-Python ORB(面向快速和旋转的BRIEF) | 四十三

    目标 在本章中,我们将了解ORB的基础知识 理论 作为OpenCV的狂热者,关于ORB的最重要的事情是它来自" OpenCV Labs".该算法由Ethan Rublee,Vinc ...

  4. php 设置允许跨域请求

    php 服务端代码 <?php header('Content-Type: text/html;charset=utf-8'); header('Access-Control-Allow-Ori ...

  5. Nginx Configure

    1.主配置/etc/nginx.conf #/etc/nginx/nginx.conf user nginx; worker_processes auto; error_log /var/log/ng ...

  6. 【强烈推荐】适合Flutter初学者的完整项目

    简介 Flutter Fly是什么?Flutter Fly是一款开源的Flutter 项目,非常适合初学者进行学习.App内集成了160+Flutter基础控件的详细介绍及用法,内容来源于:http: ...

  7. Matlab 编程简介与实例

    函数作图 二维平面曲线作图函数  plot(x, y, 's') x, y是长度相同的向量,s表示线型和颜色 如果作多条曲线在同一图上,则用函数: plot(x1, y1, 's1', x2, y2, ...

  8. centos7中安装mysql

    centos7中安装mysql网上已经很多资源了,我就不在赘述了.我这里只是记录下我安装的时候出现的一些问题. 原文:https://www.cnblogs.com/bigbrotherer/p/72 ...

  9. Java 程序该怎么优化?(工具篇)

    程序员:为什么程序总是那么慢?时间都花到哪里去了? 面试官:若你写的 Java 程序,出现了性能问题,该怎么去排查呢? 工欲善其事必先利其器,为你呈上一箩筐性能优化工具,必有一款满足你,废话不多说,直 ...

  10. C语言:const关键字用法

    参考博客:https://www.cnblogs.com/bianchengzhuji/p/10335837.html const是constant的简写,是不变的意思.但并不是说它修饰常量,而是说它 ...