直接上代码:

public class CircleArrayQueueLvcai {
private int[] array;
private int maxSize;//循环队列大小
private int front; // 队列头, 这里约定初始值为0,
private int rear ; //队列尾,初始值为0, 这里约定为 队列中最后一位元素的下一个位置(这样约定,意味着该队列的存储容量为 maxSize-1) //构造
public CircleArrayQueueLvcai(int size){
maxSize = size;
array = new int[size];
}
//是否满
public boolean isFull(){
return (rear+1) % maxSize == front; //rear+1 = maxSize 此时对maxSize取模式 结果为0
}
//是否空
public boolean isEmpty(){
return rear == front; //队列尾 = 队列头 = 0 就为空
} //添加数据
public String add(int num) throws Exception {
//判断是否满
if(isFull()){
throw new Exception("circle Queue is full, you can set num is "+(maxSize-1));
} array[rear] = num;
//rear++; 这样写不对,, 因为是循环队列,,队列添加满后,,rear自动变为0, 重新开始
rear = (rear+1) % maxSize;
return "add success";
} //出队列
public int push() throws Exception {
//判断是否为空
if(isEmpty()){
throw new Exception("circle array is empty");
}
int resultNum = array[front];
//不能这样写 front++; 循环队列, 要让front 队列头加满后, 自动变为0
front = (front+1) % maxSize;
return resultNum;
} //show circle queue
public void show(){
//是否为空
if(isEmpty()){
System.out.println(" circle queue is empty");
}
//从front开始遍历到 有效数据
for(int i=front; i<front+getAliveNum(); i++){
System.out.print(array[i]+" ");
}
System.out.println();
}
//获取 循环队列有效数据
public int getAliveNum(){
//获取队列的有效数据: (rear+maxSize-front)%maxSize , 当rear为最后一个元素的下一个位置时,这个公式是成立的
return (rear+maxSize-front)%maxSize;
} public static void main(String[] args) throws Exception {
//创建循环队列, 容量为4
CircleArrayQueueLvcai circle = new CircleArrayQueueLvcai(5);
circle.add(1);
circle.add(2);
circle.add(3);
circle.add(4);
circle.add(4);//这样的循环队列 能存的元素的大小为 size-1
circle.show();
//出队列
//circle.push();
//circle.push();
//circle.push();
//circle.show();
}

}

测试结果:

  public static void main(String[] args) throws Exception {
//创建循环队列, 容量为4
CircleArrayQueueLvcai circle = new CircleArrayQueueLvcai(5);
circle.add(1);
circle.add(2);
circle.add(3);
circle.add(4);
//circle.add(4);//这样的循环队列 能存的元素的大小为 size-1
circle.show();
//出队列
circle.push();
//circle.push();
//circle.push();
circle.show();
}

结果为:

  public static void main(String[] args) throws Exception {
//创建循环队列, 容量为4
CircleArrayQueueLvcai circle = new CircleArrayQueueLvcai(5);
circle.add(1);
circle.add(2);
circle.add(3);
circle.add(4);
//circle.add(4);//这样的循环队列 能存的元素的大小为 size-1
circle.show();
//出队列
circle.push();
circle.push();
//circle.push();
circle.show();
}

结果为:

1、java数据结构和算法---循环队列的更多相关文章

  1. Java数据结构和算法(五)——队列

    队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...

  2. Java数据结构和算法(二)--队列

    上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...

  3. 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  4. 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

      本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...

  5. Java数据结构与算法(3):队列

    队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除. 队列模型 队列的基本操作包括入队.出队操作.在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO). 队列的数组实现 对于每一个 ...

  6. Java数据结构和算法 - 栈和队列

    Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...

  7. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  8. Java数据结构和算法 - 堆

    堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...

  9. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

随机推荐

  1. Linux文件共享服务之NFS

    NFS(Network File System) 网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源.在NFS的应用中,本地NFS的客户端应用可 ...

  2. NSIS制作安装包笔记(一):NSIS介绍、使用NSIS默认向导脚本制作Windows安装包

    前言   做产品时,定制的自定义安装界面常有的,使用NSIS + Qt可以完美的定制基于QT的安装界面,先从纯NSIS开始,制作常规的安装包.   应用程序的发布方式   应用程序发布的时候,具备以下 ...

  3. Swift系列三 - 函数

    函数在任何语言中都是存在的,Swift中函数更加灵活. 一.函数的定义 1.1. 有返回值(形参默认是let,也只能是let) func pi() -> Double { return 3.14 ...

  4. Linux执行命令报错:Permission denied

    原因:权限被拒 结局办法 chmod -R 777 目录名 更改目录内文件的权限即可

  5. CM5.11与CDH5.11安装使用说明

    1.cdh5 支持jdk7和jdk82.cloudera只支持oracle发布的jdk3.集群中所有主机的jdk版本必须一致4.生态圈中用到的所有组件所依赖的jdk版本必须一致5.cloudera m ...

  6. 【java框架】SpringBoot(7) -- SpringBoot整合MyBatis

    1.整合MyBatis操作 前面一篇提到了SpringBoot整合基础的数据源JDBC.Druid操作,实际项目中更常用的还是MyBatis框架,而SpringBoot整合MyBatis进行CRUD也 ...

  7. Asp.NetCore Web开发之RazorPage

    这节讲一下Razor页面. 首先要明确,Razor 不是一种编程语言.它是服务器端的标记语言,配合C#语言,就可以像PHP语言语言一样(但它们并不相同),处理HTML页面逻辑.它是Asp.NetCor ...

  8. java面试一日一题:如何设计一款垃圾回收器

    问题:如果让你设计一个垃圾回收器,你会考虑哪些问题 分析:该问题主要考察对java中垃圾回收器的理解,要理解怎么回收:一款好的垃圾回收器有哪些衡量指标 回答要点: 主要从以下几点去考虑, 1.垃圾回收 ...

  9. 看雪加密解密第一个traceme程序破解

    工具:ollydbg(吾爱破解2.10版) 工具设置:因为traceme是一个win32图形用户程序,所以其程序入口点在WinMain()函数处,设置ollydbg的调试设置的事件选项,选中在WinM ...

  10. MindSpore模型验证

    技术背景 在前面一篇博客中,我们介绍了MindSpore在机器学习过程中保存和加载模型的方法.这种将模型存储为静态文件的做法,使得我们可以更灵活的使用训练出来的模型,比如用于各种数据集的验证,或者是迁 ...