Java实现循环队列
一、分析
队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素。允许插入的一端称为队尾,允许删除的一端称为队头。
循环队列是一种以顺序存储结构表示的队列,为了解决“假溢出”问题而将它设计成头尾相接的循环结构,它的基本操作如下:
1、初始化循环队列
2、销毁循环队列
3、清空循环队列
4、检测循环队列是否为空
5、返回循环队列的元素个数
6、返回循环队列头元素
7、向队尾插入元素
8、删除并返回队头元素
9、遍历循环队列
在循环队列中,除了用一组地址连续的存储单元依次存储从队头到队尾的元素外,还需要附设两个整型变量front和rear分别指示队头和队尾的位置。
在Java中,我们可以将循环队列视作一个类,通过成员变量数组来表示一组地址连续的存储单元,再定义两个成员变量front和rear,将循环队列的基本操作定义成类的方法,循环效果则用“模”运算实现,以此来实现循环队列。这样,初始化循环队列就是将类实例化,销毁就是销毁实例化出来的对象。
二、实现
1、定义类属性和构造函数
class InitQueue{
private int [] queue = null;
private int front = 0;
private int rear = 0;
private boolean empty = true; //true表示循环队列为空
public InitQueue(int max) { //构造指定大小的循环队列
this.queue = new int[max];
}
}
2、清空循环队列
public void clearQueue() {
this.front = 0;
this.rear = 0;
this.empty = true;
}
3、检测循环队列是否为空
public boolean queueEmpty() {
if(this.empty == true) {
return true;
}else {
return false;
}
}
4、返回循环队列的元素个数
public int queueLength() {
if (this.front == this.rear && this.empty == false) {
return this.queue.length; //如果循环队列已满,返回数组长度即元素个数
}
return (this.rear - this.front + this.queue.length) % this.queue.length; //否则,取模运算得到长度
}
5、返回循环队列头元素
public int [] getHead() {
if (this.empty == true) {
return null;
}
int [] i = new int[1];
i[0] = queue[this.front];
return i;
}
6、向队尾插入元素
public boolean enQueue(int value) {
if (this.empty == false && this.front == this.rear) {
return false;
}
this.queue[this.rear] = value;
this.rear = (this.rear + 1) % this.queue.length;
this.empty = false;
return true;
}
7、删除并返回队头元素
public int [] deQueue() {
if (this.empty == true) {
return null;
}
int [] i = new int[1];
i[0] = this.queue[this.front]; //获取队头元素
this.front = (this.front + 1) % this.queue.length; //删除队头元素(front指针加一)
if(this.front == this.rear) { //如果循环队列变空,改变标志位
this.empty = true;
}
return i;
}
8、遍历循环队列
public String queueTraverse() { //此处用输出循环队列表示遍历
String s = "";
int i = this.front; //i指向第一个元素
if(this.front == this.rear && this.empty == false) { //如果循环队列已满,取出第一个元素,i指向下一个元素
s += this.queue[i] + "、";
i = (i + 1) % this.queue.length;
}
while (i != this.rear) { //如果未到末尾,则循环读取元素
s += this.queue[i] + "、";
i = (i + 1) % this.queue.length;
}
if(s.length() == 0) { //如果没有读取到元素,直接返回空字符串
return s;
}
return s.substring(0,s.length() - 1); //除去最后的顿号返回
}
三、小结
以上就是循环队列用Java的实现,由于只定义了整数的数组,因此只能操作整数数据,但循环队列的基本思想都已实现。
Java实现循环队列的更多相关文章
- java数据结构---循环队列
#java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...
- java算法--循环队列
循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...
- Java数据结构——循环队列
普通顺序队列存在的问题在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位.出队时,则是头指针front后移一个单位.像这样进行了一定数量的入队和出队操作后, ...
- Java数组实现循环队列的两种方法
用java实现循环队列的方法: 1.添加一个属性size用来记录眼下的元素个数. 目的是当head=rear的时候.通过size=0还是size=数组长度.来区分队列为空,或者队列已满. 2.数组中仅 ...
- 用数组实现队列(顺序队列&循环队列)
用数组实现队列(顺序队列&循环队列) 顺序队列 ️ 队列(先进先出) 几个问题: 队列方法:入队.出队 队列的存储:即队首队尾两个指针, 扩容:如果队列容量不够了,应该扩容,如果队尾没有位置了 ...
- 数据结构Java实现07----队列:顺序队列&顺序循环队列、链式队列、顺序优先队列
一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其 ...
- Java实现一个简单的循环队列
在某些时候,我们不能被要求像数组一样可以使用索引随机访问,而是需要被限制顺序处理业务,今天介绍一种先进先出(FIFO)的线性数据结构:队列, 当然,还有后进先出(LIFO)的处理方式,即为栈(后续有时 ...
- Java数据类型Stack栈、Queue队列、数组队列和循环队列的比较
判断括号是否匹配:调用java本身 import java.util.Stack; public class Solution { public boolean isValid(String s){ ...
- 【Java】 大话数据结构(7) 循环队列和链队列
本文根据<大话数据结构>一书,实现了Java版的循环队列.链队列. 队列:只允许在一端进行插入操作,而在另一端进行删除操作的线性表. 1.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
随机推荐
- 【原创】洛谷 LUOGU P3372 【模板】线段树1
P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...
- javascript面向对象 用new创建一个基于原型的javascript对象
//创建一个类 其实就是个对象 var Student={ name:"robot", height:1.6, run:function(){ console.log(this.n ...
- Appium环境搭建(win/mac)
课程使用Windows+Android虚拟机, 建议使用Windows系统学习课程, 如使用Mac系统, 请另外准备一台Andorid手机 Windows系统Appium环境搭建 安装JDK并配置环境 ...
- 通过python的urllib.request库来爬取一只猫
我们实验的网站很简单,就是一个关于猫的图片的网站:http://placekitten.com 代码如下: import urllib.request respond = urllib.request ...
- CF892D—Gluttony(思维,好题)
http://codeforces.com/contest/892/problem/D D. Gluttony You are given an array a with n distinct int ...
- Java线程之join
简述 Thread类的join方法用来使main线程进入阻塞状态,进而等待调用join方法的线程执行,join有三个重载方法: public final void join() 使主线程进入阻塞状态, ...
- Cache As Ram
1. Why need Cache? Cache又称之为高速缓存,是为了弥补CPU和主存之间逐渐增大的速度上的差距 而被迫在两者之间加入的一个小的SRAM.现代处理器上通常都会有三级或者是四级缓存,这 ...
- MySQL优化相关参数--先做个记录,以后可能用得到
innodb_io_capacity:可设置的磁盘IO性能参数,越高代表当前mysql的IO性能更好,可用做决策刷脏页速度的参数: innodb_flush_neighbors:刷脏页是否开启连坐机制 ...
- 一百零六:CMS系统之修改邮箱功能完成
这里采用把验证码放到memcached中,所以封装一个memcached的操作 import memcache cache = memcache.Client(['127.0.0.1:11211'], ...
- GlusterFS集群
使用架构: 2台机器安装 GlusterFS 组成一个 Distributed Replicated Volumes集群 192.168.0.92 服务端 192.168.0.93 服务端 192.1 ...