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. vim 替换所有字符串

    将dev 替换 为 prod: :%s/dev/prod/g

  2. NumPyArray

    import arcpy import numpy # Create a simple array from scratch using random values myArray = numpy.r ...

  3. Mysql sql_mode设置 timestamp default 0000-00-00 00:00:00 创建表失败处理

    往数据库里创建新表的时候报错: [Err] 1067 - Invalid default value for 'updateTime' DROP TABLE IF EXISTS `passwd_res ...

  4. elasticsearch使用BulkProcessor批量入库数据

    在解决es入库问题上,之前使用过rest方式,经过一段时间的测试发现千万级别的数据会存在10至上百条数据的丢失问题, 在需要保证数据的准确性的场景下,rest方式并不能保证结果的准确性,因此采用了el ...

  5. Javascript之hoisting变量提升

    javascript不仅仅是一门弱类型语言,还是一门解释型语言.一门编程语言的本质就是这样,优点即是缺点,缺点也往往是优点.JS因为有了变量提升,能够使我们在编程时可以忽略“先声明,再使用”的规则,但 ...

  6. composer Changed current directory to没反应

    根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C:/User ...

  7. Mac OS -bash: psql: command not found 使用 psql 命令报错

    使用 psql 在 mac os 系统上登录,系统显示没有 psql 这个命令存在 解决方法如下: 将 postgresql 的 bin 目录添加到环境变量中即可 export PATH=" ...

  8. Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件,导致发生错误。如果未分配 ID,请显式设置引发回发事件的控件的 ID 属性以避免此错误。

    ylbtech-Error-ASP.NET:由于未能找到 id 为“FileUpload1$gvFiles$ctl02$lnkBtnRemoveFile”的控件或在回发后将同一 ID 分配给另一个控件 ...

  9. npm使用国内源

    npm使用国内源 转   https://www.jianshu.com/p/7e84d7b119bc $ npm install -g cnpm --registry=https://registr ...

  10. IDEA使用tomcat插件

    在实际项目开发中,特别是分布式项目,往往有N多个子项目需要同时启动测试. 这一切靠本地安装的tomcat是远远不够的,而且繁琐. 这里就需要用到tomca插件. 在pom.xml中引入: <bu ...