Java数据结构——循环队列
普通顺序队列存在的问题
在普通顺序队列中,入队的操作就是先将尾指针rear右移一个单位,然后将元素值赋值给rear单位。出队时,则是头指针front后移一个单位。像这样进行了一定数量的入队和出队操作后,可能会出现这样的情况:
尾指针rear已指到数组的最后有一个元素,即rear==MaxLen-1,此时若再数组的前面部分可能还有很多闲置空间,即这种溢出并非是真的没有可用的存储空间,故称这种溢出现象为“假溢出”。显然,必须要解决这一块假溢出的问题,否则顺序队列就没有太多使用价值。
循环队列
循环队列的存储结构,头、尾指针都和普通顺序队列相同。不同的只是将队列视为“环状结构”,即data[0]为紧接着data[MaxLen-1]的单元,为相邻的元素,首位成为一个环。结构如下:
队列为空的条件:rear==front;
队列为满的条件:(rear+1)%maxSize==front
实现:
public class MyDlQueue {
private Object data[];
private int rear;
private int front;
private int maxSize = 10; // 初始化队列
public MyDlQueue(int maxSize) {
if (maxSize >= 0) {
this.maxSize = maxSize;
rear = front = 0;
data = new Object[maxSize];
} else {
throw new RuntimeException("初始化队列大小不能小于0");
} } // 判空
public boolean empty() {
return rear == front ? true : false;
} // 判满
public boolean full() {
//maxsize加1是因为①处的rear指向队尾的后一个
return ((rear + 1) % (maxSize + 1)) == front ? true : false;
} // 入队
public boolean add(Object obj) {
if (full()) {
throw new RuntimeException("队满");
} else {
rear = rear % maxSize; //防止数组越界
data[rear] = obj;
rear = (rear + 1) % (maxSize + 1); //①
return true;
}
} // 出队
public Object poll() {
if (empty()) {
throw new RuntimeException("队空");
} else {
Object value = data[front];
data[front] = null;
front = (front + 1) % maxSize;
return value;
}
} // 获取队首元素
public Object peek() {
if (empty()) {
throw new RuntimeException("队空");
} else {
return data[front];
}
} // 返回队列长度
public int length() {
return rear - front;
} public static void main(String[] args) {
MyDlQueue queue = new MyDlQueue(5);
queue.add(1);
queue.add(2);
queue.add(3);
queue.add(4);
queue.add(5);
System.out.println(queue.length());
System.out.println(queue.empty());
System.out.println(queue.peek());
System.out.println(queue.poll());
queue.add("aaa");
for (Object obj : queue.data) {
System.out.print(obj + " ");
}
}
}
Java数据结构——循环队列的更多相关文章
- java数据结构---循环队列
#java学习经验总结------循环队列的实现(数组) package datastructure;/*数组实现循环队列 队列first in first out*/ public class Ci ...
- C语言数据结构-循环队列的实现-初始化、销毁、清空、长度、队列头元素、插入、删除、显示操作
1.数据结构-循环队列的实现-C语言 #define MAXSIZE 100 //循环队列的存储结构 typedef struct { int* base; //基地址 int _front; //头 ...
- Java数据结构之队列的实现以及队列的应用之----简单生产者消费者应用
Java数据结构之---Queue队列 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在 ...
- Java实现循环队列
一.分析 队列是一种先进先出的线性表,它只允许在表的一端进行插入,而在另一端删除元素.允许插入的一端称为队尾,允许删除的一端称为队头. 循环队列是一种以顺序存储结构表示的队列,为了解决“假溢出”问题而 ...
- java算法--循环队列
循环队列 我们再用队列得时候不知道发没发现这样一个问题. 这是一个只有三个位置得队列,在进行三次加入(addqueue)操作和三次取出(get)操作之后再进行加入操作时候的样子.明显可以看到,队列已经 ...
- java数据结构之队列
队列概述队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作.进行插入操作的端称为队尾,进行删除操作的端称为队头.队列中没有元素时,称为空队列.– ...
- 数据结构-循环队列(Python实现)
今天我们来到了循环队列这一节,之前的文章中,我介绍过了用python自带的列表来实现队列,这是最简单的实现方法. 但是,我们都知道,在列表中删除第一个元素和删除最后一个元素花费的时间代价是不一样的,删 ...
- 图解Java数据结构之队列
本篇文章,将对队列进行一个深入的解析. 使用场景 队列在日常生活中十分常见,例如:银行排队办理业务.食堂排队打饭等等,这些都是队列的应用.那么队列有什么特点呢? 我们知道排队的原则就是先来后到,排在前 ...
- Java数据结构——优先级队列
//================================================= // File Name : PriorityQueue_demo //------------ ...
随机推荐
- 老男孩Django笔记(非原创)
.WEB框架 MVC Model View Controller 数据库 模板文件 业务处理 MTV Model Template View 数据库 模板文件 业务处理 ############## ...
- Skill 脚本演示 ycChangeLayerToEntry.il
https://www.cnblogs.com/yeungchie/ ycChangeLayerToEntry.il 快速切换选中 figs 的 lpp(Layer-Purpose Pair). 回到 ...
- 转)JVM Internals
http://blog.jamesdbloom.com/JVMInternals.html (基于 Java 7)
- easyui 属性 事件 方法
在easyui当中 属性和事件可以按照json定义的对象来使用. /*在easyui中 属性和事件的使用方法相同*/ var loginWinJson = { closed: false, closa ...
- Pytorch Autograd (自动求导机制)
Pytorch Autograd (自动求导机制) Introduce Pytorch Autograd库 (自动求导机制) 是训练神经网络时,反向误差传播(BP)算法的核心. 本文通过logisti ...
- .NET三层架构各项目之间的引用关系及如何添加引用?
1.1三层之间的引用 整个.NET框架的项目创建完成之后,在开发之前,还需要建立各个项目之间的引用关系,以便在编写C#业务逻辑代码时调用相关项目的类库. 1.1.1 引用关系规则 .NET三层架构中的 ...
- adb如何连接Mac版腾讯手游助手
Mac版腾讯手游助手,的端口是6555: 所以使用adb connect 127.0.0.1:6555 进行连接
- “随手记”开发记录day05
今天完成了关于统计页面里面的总览页面 里面的功能有可以显示你这个月的花费最多的账单,和收入最多的页面 还有总计 运行效果如图所示
- 【Canal】数据同步的终极解决方案,阿里巴巴开源的Canal框架当之无愧!!
写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...
- Docker 启动 OpenResty
Docker 启动 OpenResty OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭建 ...