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.循环队列 队列的顺序储存结构:用数组存储队列,引入 ...
随机推荐
- UVA 10029 Edit Step Ladders ——(DAG求最长路)
题意:升序的给出一本若干个单词,每个单词都可删除一个字母,添加一个字母或者改变一个字母,如果任意一个操作以后能变成另外一个字典中的单词,那么就连一条有向边,求最长的长度. 分析:DAG的最长路和最短路 ...
- CF280C
CF280C ZR补题计划 题意: 一棵有根树,每次选择一个未删除的节点,然后删除它和它的子树内的点,问期望删多少次可以把整个树删完 解析: 显然,通过题面,我们可以知道对于一个点对 $ (u,v) ...
- redis延时监控
一. slow log慢查询日志 Redis监控工具,命令和调优 slowlog是 Redis 用来记录查询执行时间的日志系统.slowlog-log-slower-than设置慢操作的阈值,单位是微 ...
- 实现多列等高布局_flex布局
详情参见此篇博客 http://www.w3cplus.com/css/creaet-equal-height-columns 建议掌握方法四.五 其实,利用最新的flex布局 http://www. ...
- QList和QVector等容器的区别
QList和QVector等容器的区别. 1.大多数情况下可以用QList.像prepend()和insert()这种操作,通常QList比QVector快的多.这是因为QList是基于index标签 ...
- 把文档中的数据取出并插入到excel中
from xlrd import open_workbookfrom xlutils.copy import copy jsonfile=r'C:\Users\Administrator\Deskto ...
- MySql workbeach 更改侧边栏大小
1.定位到workbench的样式目录下 cd /usr/share/mysql-workbench/ 2.更改其样式文件 GtkStatusbar GtkLabel { font-size: 12p ...
- Mysql 查询当前数据上一条和下一条的记录
获取当前文件上一条与下一条记录的原理是上一条的sql语句,从news表里按从大到小的顺序选择一条比当前ID小的新闻,下一条的sql语句,从news表里按从小到大的顺序选择一条比当前ID大的新闻. 如果 ...
- mybatis低版本jsr310(LocalDateTime,LocalDate等) Joda Time支持
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybati ...
- Spring MVC的多视图解析器配置及与Freemarker的集成
一.从freemarker谈起 Freemarker使用模板技术进行视图的渲染.自从看了Struts标签.Freemarker.JSTL的性能对比后,我毅然决定放弃Struts标签了!效率太差…… S ...