(上一篇队列: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. Java 访问修饰符大全详解

    鉴于笔试面试总会遇到,决心仔细认真梳理一下: 1:涉及的关键字:public,default(表示缺省),protected,private,static,final,abstract. 2:关键字含 ...

  2. Hive常用的10个系统函数及作用

    聚合函数 函数处理的数据粒度为多条记录. sum()—求和 count()—求数据量 avg()—求平均直 distinct—求不同值数 min—求最小值 max—求最人值 分析函数 Analytic ...

  3. Spring03——有关于 Spring AOP 的总结

    本文将为各位带来 Spring 的另一个重点知识点 -- Spring AOP.关注我的公众号「Java面典」,每天 10:24 和你一起了解更多 Java 相关知识点. 什么是 AOP 面向切面编程 ...

  4. 干货 | NLP算法岗大厂面试经验与路线图分享

    最近有好多小伙伴要面经(还有个要买简历的是什么鬼),然鹅真的没有整理面经呀,真的木有时间(。 ́︿ ̀。).不过话说回来,面经有多大用呢?最起码对于NLP岗位的面试来说,作者发现根本不是面经中说的样子 ...

  5. Node.js安装过程

    今天电脑的node用不了了,于是决定重新安装一下 一.安装Node.js 1.首先,可以直接去Node的官网寻找适合自己电脑系统的版本 官网地址:https://nodejs.org/en/downl ...

  6. thinkphp5源码剖析系列1-类的自动加载机制

    前言 tp5想必大家都不陌生,但是大部分人都停留在应用的层面,我将开启系列随笔,深入剖析tp5源码,以供大家顺利进阶.本章将从类的自动加载讲起,自动加载是tp框架的灵魂所在,也是成熟php框架的必备功 ...

  7. Java程序员拥有这些工具,还怕干不出好活

    老话说,工欲善其事,必先利其器. 那么,作为编程人员,你都用过哪些“兵器”呢?你的”兵器“够”锋利”吗? 近期,有很多新朋友问,都有什么画流程图的工具,给推荐推荐? 索性,就静下来,好好梳理一下,从事 ...

  8. PTA数据结构与算法题目集(中文) 7-3

    PTA数据结构与算法题目集(中文)  7-3 树的同构 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的.例如图1给出的两棵树就是同构的,因为我们把其中一 ...

  9. udev规则,部署Multipath

    部署Multipath多路径环境 配置iSCSI服务 编写udev规则 配置并访问NFS共享 部署Multipath多路径环境 1 配置iSCSI服务 1.1 问题 本案例要求先搭建好一台iSCSI服 ...

  10. Tcl编成第二天,set与unset

    代码如下: #!/usr/bin/tclsh set value "one" puts $value unset value puts $value set表示创建一个变量第一个参 ...