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


2.rear变量的含义:rear指向队列的最后一个元素的后一个位置.因为希望空出一个空间做为预留空间。 rear的初始值=0。


3.当队列满时,条件是(rear +1)%maxsize=front【满】。


4.对队列为空的条件,rear==front空。


5.当我们这样分析,队列中有效的数据的个数(rear+ maxsize-front)%maxsize

 
public class CircleArrayQueue {
public static void main(String[] args) {
System.out.println("测试数组模拟环形队列");
circlearrqueue aq=new circlearrqueue(3);
char key=' ';//接收用户输入
Scanner scanner =new Scanner(System.in);
boolean loop=true;
//输出有个菜单
while(loop){
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("h(ehead):查看队列头的数据 ");
System.out.println("g(get):取出队列头的数据 ");
key=scanner.next().charAt(0);//接受一个字符
switch (key){
case 's':
aq.showQueue();
break;
case 'a':
System.out.println("输出一个数");
int value=scanner.nextInt();
aq.addQueue(value);
break;
case 'g':
try{
int res=aq.getQueue();
System.out.printf("取出的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'h'://查看队列头的数据
try{
int res =aq.headQueue();
System.out.printf("队列头的数据是%d\n",res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case 'e'://退出
scanner.close();
loop=false;
break;
default:
break;
}
}
System.out.println("程序退出");
}
} class circlearrqueue{
private int maxsize;//表示队列的长度
private int front;//队列头
private int rear;//队列尾
private int[] arr;//该数组用于存放数据
public circlearrqueue(int arrMaxSize){
maxsize = arrMaxSize;
arr = new int[maxsize];
}
public boolean isFull(){
return (rear+1)%maxsize==front;
}
public boolean isEmpty(){
return rear==front;
}
public void addQueue(int n){
//判断队列是否为满
if(isFull()){
System.out.println("队列满 ,不能加入");
return;
}
arr[rear]=n;//直接将数据添加
rear=(rear+1)%maxsize;
} public int getQueue(){
//判断队列是否为空
if(isEmpty()){
//通过抛出异常
throw new RuntimeException("队列空,不能取数据");
}
//这里需要分析front是指向队列的第一个元素
//1.先把front的值保留到临时变量 2.将front后移 3.将临时变量的值返回
int value=arr[front];
front=(front+1)%maxsize;
return value;
}
public void showQueue(){
//遍历
if(isEmpty()){
System.out.println("队列为空,没有数据");
return;
}
//从front开始遍历,遍历多少个元素?
for(int i=front;i<front+size();i++){
System.out.printf("arr[%d]=%d\n",i%maxsize,arr[i%maxsize]);
}
}
//求出当前数列有效个数
public int size(){
return (rear+maxsize-front)%maxsize;
}
public int headQueue(){
//判断
if(isEmpty()){
throw new RuntimeException("队列为空,没有数据");
}
return arr[front];
} }

数组模拟循环队列(java实现)的更多相关文章

  1. C语言实现使用动态数组实现循环队列

    我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...

  2. 用OC基于数组实现循环队列

    一.简言 使用数组实现循环队列时,始终会有一个空余的位置预留着,作为一个判决队列已满的条件(当然也可以采用其他方式).在前面已经用C++介绍了基本的算法,可以去回顾一下https://www.cnbl ...

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

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

  4. Java数组模拟环形队列

    2.环形队列 (上一篇队列:https://www.cnblogs.com/yxm2020/p/12676323.html) 百度百科 1.假溢出 ​ 系统作为队列用的存储区还没有满,但队列却发生了溢 ...

  5. 基于数组的循环队列(C++模板实现)

    循环队列使用数组实现的话,简单.方便.之前实现的队列,当尾端索引到达队列最后的时候,无论前面是否还有空间,都不能再添加数据了.循环队列使得队列的存储单元可以循环利用,它需要一个额外的存储单元来判断队列 ...

  6. 队列的理解和实现(一) ----- 循环队列(java实现)

    什么是队列 我们都知道栈是先进后出的一种线性表,与之相反的是,队列是一种先进先出的线性表.它只允许在表的一端进行插入,而在另一端进行删除.举个例子来说,在生活中我们买东西需要进行排队,最先排队的可以最 ...

  7. 循环队列java实现

    public class SeqHeap { Object[] data; int font; int rear; int maxSize; public SeqHeap(int maxSize) { ...

  8. 深入理解循环队列----循环数组实现ArrayDeque

    我们知道队列这种数据结构的物理实现方式主要还是两种,一种是链队列(自定义节点类),另一种则是使用数组实现,两者各有优势.此处我们将要介绍的循环队列其实是队列的一种具体实现,由于一般的数组实现的队列结构 ...

  9. 教你如何使用Java手写一个基于数组实现的队列

    一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...

随机推荐

  1. [luogu 4719][模板]动态dp

    传送门 Solution \(f_{i,0}\) 表示以i节点为根的子树内,不选i号节点的最大独立集 \(f_{i,1}\)表示以i节点为根的子树内,选i号节点的最大独立集 \(g_{i,0}\) 表 ...

  2. AtCoder Beginner Contest 133 E - Virus Tree 2(组合数学)

    题意 n个点的树k种颜色,距离不超过2的点对需颜色不同,求方案数 Code(copy) #include<iostream> #include<cstdio> #include ...

  3. WEB甘特图(机器运行状态图)

    前台框架使用BootStrap轻量级框架AdminLTE 后台框架使用的是Spring.SpringMVC 初此使用数据库SQL Server故只能用JDBC连接 请勿见怪!jsp页面重复添加元素过多 ...

  4. 用vue做todolist

    <template> <div class="hello"> <div style="height:25px;line-height:25p ...

  5. HugeGraph入门

    一.HugeGraph简介 最近在搞好友推荐方便的工作,选择了图数据的方法,使用并学习了HugeGraph,再次记录一下. HugeGraph是百度在2018年中旬开源的一款图数据库(Graph Da ...

  6. CI框架常用函数(AR数据库操作的常用函数)

    用户手册地址:http://codeigniter.org.cn/user_guide/index.html 1.查询表记录$this->db->select(); //选择查询的字段$t ...

  7. Unity火爆插件Behavior Designer行为树插件学习

    如果要让游戏里的角色或者NPC能执行预设的AI逻辑,最简单的用IF..ELSE...神器既可以实现, 但是再复杂的一般用经典的状态机来切换状态,但是写起来比较麻烦.相对的,行为树(Behavior T ...

  8. Python5种代码维护工具

    原文地址:https://cloud.tencent.com/developer/article/1365969 随着软件项目进入“维护模式”,对可读性和编码标准的要求很容易落空(甚至从一开始就没有建 ...

  9. 关于Kubernetes Master高可用的一些策略

    关于Kubernetes Master高可用的一些策略 Kubernetes高可用也许是完成了初步的技术评估,打算将生产环境迁移进Kubernetes集群之前普遍面临的问题. 为了减少因为服务器当机引 ...

  10. hive分区表新增字段,已有分区显示为null

    如果在hive的分区表新增非分区字段,那么原有的分区的数据即使重新运行也会显示为null. 必须先删除该分区,再重新跑数据.