1、java数据结构和算法---循环队列
直接上代码:
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数据结构和算法---循环队列的更多相关文章
- Java数据结构和算法(五)——队列
队列.queue,就是现实生活中的排队. 1.简单队列: public class Queqe { private int array[]; private int front; private in ...
- Java数据结构和算法(二)--队列
上一篇文章写了栈的相关知识,而本文会讲一下队列 队列是一种特殊的线性表,在尾部插入(入队Enqueue),从头部删除(出队Dequeue),和栈的特性相反,存取数据特点是:FIFO Java中queu ...
- 【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- 【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现
本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型 ...
- Java数据结构与算法(3):队列
队列也是一种表,不同的是队列在一端进行插入而在另一端进行删除. 队列模型 队列的基本操作包括入队.出队操作.在表的末端插入元素,在表的开头删除元素,即先进先出(FIFO). 队列的数组实现 对于每一个 ...
- Java数据结构和算法 - 栈和队列
Q: 栈.队列与数组的区别? A: 本篇主要涉及三种数据存储类型:栈.队列和优先级队列,它与数组主要有如下三个区别: A: (一)程序员工具 数组和其他的结构(栈.队列.链表.树等等)都适用于数据库应 ...
- Java数据结构和算法(六)——前缀、中缀、后缀表达式
前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...
- Java数据结构和算法 - 堆
堆的介绍 Q: 什么是堆? A: 这里的“堆”是指一种特殊的二叉树,不要和Java.C/C++等编程语言里的“堆”混淆,后者指的是程序员用new能得到的计算机内存的可用部分 A: 堆是有如下特点的二叉 ...
- Java数据结构和算法 - 二叉树
前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...
随机推荐
- hdu2371 矩阵乘法(求序列位置改变m次后的序列)
题意: 给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2 ...
- drozer源码学习:app
源码下载:https://github.com/mwrlabs/drozer:模块的源码位于src.drozer.modules,根据模块名来划分文件夹: app.auxiliary.exploit. ...
- NTDDK 从两个最简单的驱动谈起
第 1 章 从两个最简单的驱动谈起 Windows 驱动程序的编写,往往需要开发人员对 Windows 内核有深入了解和大量的内 核调试技巧,稍有不慎,就会造成系统的崩溃.因此,初次涉及 Window ...
- nodejs-Buffer(缓冲区)
Node.js Buffer(缓冲区) JavaScript 语言自身只有字符串数据类型,没有二进制数据类型. 但在处理像TCP流或文件流时,必须使用到二进制数据.因此在 Node.js中,定义了一个 ...
- Linux执行命令报错:Permission denied
原因:权限被拒 结局办法 chmod -R 777 目录名 更改目录内文件的权限即可
- gitlab + php自动部署
功能简介 本地往服务器推送代码之后,触发web钩子,服务器拉取刚刚推送的代码 步骤 1.在gitlab后台配置钩子 项目->编辑项目->Web钩子->新增钩子 2.在服务器端为www ...
- CAS指令
原文链接:https://www.jianshu.com/p/00edb3d74a33 CAS是CPU的一条指令,其具有原子性,原子性是由CPU硬件层面保证的. CAS原语有三个操作数--内存 ...
- 解决移动端300ms延迟fastclick
为什么要使用fastclick 移动设备上的浏览器默认会在用户点击屏幕大约延迟300毫秒后才会触发点击事件,这是为了检查用户是否在做双击.为了能够立即响应用户的点击事件,才有了fastclick. f ...
- C++ primer plus读书笔记——第8章 函数探幽
第8章 函数探幽 1. 对于内联函数,编译器将使用相应的函数代码替换函数调用,程序无需跳到一个位置执行代码,再调回来.因此,内联函数的运行速度比常规函数稍快,但代价是需要占用更多内存. 2. 要使用内 ...
- 关于__new__和__call__的想法
__new__和__call__很像,两个都是用来产生对象的 __new__用来产生的对象是'类',class 时触发(不是) __call__用来产生的对象是'对象',这种对象无法继续产生对象,但是 ...