Java数组模拟环形队列
(上一篇队列: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数组模拟环形队列的更多相关文章
- 数组模拟循环队列(java实现)
1.front变量的含义:front就指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素front的初始值=0. 2.rear变量的含义:rear指向队列的最后一个元素的后一个位置 ...
- Java数组模拟队列 + 优化
队列介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则. 即:先存入队列的数据,要先取出.后存入的要后取出 示意图:(使用数组模拟队列示意图) 数组模拟队列 队列本身是有序列表 ...
- Java数组模拟队列
队列 先进先出 什么意思呢? 我的理解:队列就是一个数组(不包含链表),然后我们给它施加一个存数据和取数据的规则 当只允许从一端存数据,从另一端取数据的数组,就是队列,我们要做的就是给这个数组施加我们 ...
- Java数组模拟栈
一.概述 注意:模拟战还可以用链表 二.代码 public class ArrayStack { @Test public void test() { Stack s = new Stack(5); ...
- Java数组实现循环队列的两种方法
用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...
- 用java数组模拟登录和注册功能
package com.linkage.login; import java.util.Scanner; public class user { // 存储用户名和密码 public static S ...
- 用java数组模拟购物商城功能与实现
实体类1(商品): package mall.model; public class goods { private int shoppingID; // 商品编号 private String sh ...
- 数据结构算法学习之队列(数组模拟java实现)
数组模拟队列 数组模拟队列 今天学习数组模拟队列.队列常用于生活中的方方面面.比如银行叫号排队.实际上就是队列.所有人抽号排队.先去的先抽号.所以靠前的号最后会先被叫到然后出队.后边的会随之往前移位. ...
- Java 单向队列及环形队列
队列的特点 1.可以使用数组和链表两种方式来实现. 2.遵循先入先出(FIFO)的规则,即先进入的数据先出. 3.属于有序列表. 图解实现过程: 1.定义一个固定长度的数组,长度为maxSize. ...
随机推荐
- 贪心-谷歌-857. 雇佣 K 名工人的最低成本
2020-03-15 22:00:39 问题描述: 有 N 名工人. 第 i 名工人的工作质量为 quality[i] ,其最低期望工资为 wage[i] . 现在我们想雇佣 K 名工人组成一个工资组 ...
- tpyboard v202 测试tcp通讯,i2c的oled程序,呼吸灯源码,希望对大家有所帮助
1.下载到板子里的main.py代码如果需要驱动oled的,可以参考我上面那篇文章import time, mathimport machineimport network# from ssd1306 ...
- 浅尝Go语言GC
大家好,我是小栈君,因为个人和工作的缘故,所以拖更了一点时间,但是关于拖更的内容小栈君会在后续的时间中补回来,还希望大家继续支持和关注小栈君.当然,在国内疫情稍微减缓的情况下,小栈君在这里也多说两句, ...
- 编译器移植到.NET Core失败记录和对.NET未来感想
.NET Core是微软力推的新平台,影响力好像还越来越大.为了对这一行业趋势有所准备,最近把自己搞的编程语言的编译器从.NET移植.NET Core,以实现跨平台在Linux上运行,然而失败了. 原 ...
- Android | 教你如何用华为HMS MLKit SDK 三十分钟在安卓上开发一个微笑抓拍神器
Android | 只要三十分钟就可以在手机上开发一个微笑抓拍神器!!! 前言 前段时间Richard Yu在发布会上给大家介绍了华为HMS Core4.0,回顾发布会信息请戳: 华为面向全球发布HM ...
- 150+行Python代码实现带界面的数独游戏
150行代码实现图形化数独游戏 Github地址,欢迎各位大佬们fork.star啥的,感谢: 今天闲着没事干,以前做过html+js版的数独,这次做个python版本的,界面由pygame完成,数独 ...
- 基于zookeeper实现分布式锁和基于redis实现分布所的区别
1,实现方式不同 zookeeper实现分布式锁:通过创建一个临时节点,创建的成功节点的服务则抢占到分布式锁,可做业务逻辑.当业务逻辑完成,连接中断,节点消失,继续下一轮的锁的抢占. redis实现分 ...
- Maven多仓库配置(公司仓库和阿里云仓库)
Maven多仓库配置(公司仓库和阿里云仓库) 一.之前的配置 之前maven本地的setting.xml的仓库配置,都是直接设置mirror节点 <mirrors> <mirror& ...
- C 怪兽游戏
时间限制 : - MS 空间限制 : - KB 评测说明 : 1s,256m 问题描述 何老板在玩一款怪兽游戏.游戏虽然简单,何老板仍旧乐此不疲.游戏一开始有N只怪兽,编号1到N.其中第i只怪兽 ...
- RabbitMQ集群架构(HA)并结合.NET Core实操
一.前言 已经一年没有更新博客了,由于公司事务比较多,并且楼主我也积极在公司项目中不断实践.net core.DDD以及Abp vnext,也积累了一些吐血经验,目前我在做一家在线教育公司负责智慧校园 ...