当前位置: 首页 > news >正文

java 循环队列实现_Java实现循环队列

队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作

队列的实现方式

1、链表队列

2、静态队列(数组)

实现静态队列

class Queue {

private int front;

private int rear;

private Object[] objects;

private int size;

public Queue(int size) {

front = 0;

rear = 0;

this.size = size + 1;

objects = new Object[size];

}

public void add(Object o) {

if (isFull()) {

System.out.println("队列已满,无法添加");

return;

}

objects[rear] = o;

rear = (rear + 1) % size;

}

public Object get() throws EmptyException {

if (isEmpty()) {

throw new EmptyException("队列为空,无法取出元素");

}

Object o = objects[front];

front = (front + 1) % size;

return o;

}

public boolean isEmpty() {

return front == rear;

}

public boolean isFull() {

return (rear + 1) % size == front;

}

public int getCount() {

return (rear - front + size) % size;

}

public void show() {

int count = getCount();

for(int i = 0; i < count; i++) {

System.out.println(objects[front]);

front = (front + 1) % size;

}

}

}

class EmptyException extends Exception {

public EmptyException() {

}

public EmptyException(String s) {

super(s);

}

}

简要分析代码

参数的意义

front 永远指向队列的 第一个元素

rear 永远指向队列的最后一个元素的 下一个位置

构造方法

队列进行初始化,front = 0,rear = 0;

1c9b3a5ffbec0b44179d22bd8ecf4e41.png

为什么要 this.size = size + 1; 后面在解释

isEmpty() 和 isFull() 方法

根据 front rear 的意义,不难得出判断队列是否为空就是 front == rear

我们来看下判断队满的条件

312c1762eb127a7e6da1bd4ff33823f5.png

如图,此时在添加元素5,队列就满了,同时 rear = 0

9fff338abdf9094abb298ed39b68e629.png

这个时候我们发现,rear == front

因此队列满的条件为:rear == front

这与判断队列空的条件相同,但是此时队列是有元素的

队列元素:2,6,3,0,1,5

因此队列满的条件不能是:rear == front

我们通常会舍弃一个空间(不用来存放数据),也就是说,大小为 n 的数组,存放的元素的个数为 n – 1

这样判断队满的条件就变为:(rear + 1) % size == front

这也就是为什么 this.size = size + 1

因为别人不知道,你只能存放 n – 1 个数据

getCount() 方法

获取元素的个数

当 rear > front

元素个数为:rear – front

312c1762eb127a7e6da1bd4ff33823f5.png

元素个数为:5 – 0 = 5

当 rear < front

619f1bb0201c7fb5555b7e3afb15cd17.png

第一段为:size – front

第二段为:rear – 0

因此,元素个数为:(rear – front + size)

结合两种情况:

rear > front

(rear – front + size) % size = rear – front

rear < front

(rear – front + size) % size = rear – front + size

因此,通用公式为: (rear – front + size) % size

show() 方法

遍历队列,如果我们知道队列中元素的个数,那么循环次数就确定了下来,通过前面分析,队列个数为 (rear – front + size) % size

每循环一次,就取出队列中 front 所指向的元素

取完之后,front = (front + 1) % size,指向下一个队列中的元素

相关文章:

  • 长期用电脑人士要多吃樱桃
  • [软工]此EUP非彼EUP
  • java 加减乘除是原子操作吗_Go并发编程之传统同步—(3)原子操作
  • 毕业了
  • mysql innodb 删除_MySQL InnoDB 删除资料后释放硬盘空间
  • request变量java jsp_JSP里request变量列表
  • transition java_Transition 过渡
  • 相对最完整的软件测试工具手册
  • 上传图片并且生成可以控制大小图片清晰度的方法
  • 手机php开发环境,PHP开发环境搭建
  • 要不要把php5升级到php7,将php5升级到php7后AJAX不工作
  • [软工]近距离接触RUP plug-in
  • zblog asp 转 php,怎么把zblog asp 2.2转换成zblog php 1.5的方法
  • 扩展XDoclet对Spring List引用注入的支持
  • wifidog php,用php写wifidog的认证服务器
  • [译]前端离线指南(上)
  • 【剑指offer】让抽象问题具体化
  • Angularjs之国际化
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • Material Design
  • Vim Clutch | 面向脚踏板编程……
  • 计算机在识别图像时“看到”了什么?
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 日剧·日综资源集合(建议收藏)
  • 使用Envoy 作Sidecar Proxy的微服务模式-4.Prometheus的指标收集
  • 微服务框架lagom
  • 微信小程序开发问题汇总
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 译有关态射的一切
  • 用jQuery怎么做到前后端分离
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (Oracle)SQL优化技巧(一):分页查询
  • (三)mysql_MYSQL(三)
  • (十五)使用Nexus创建Maven私服
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .bashrc在哪里,alias妙用
  • .NET Core 成都线下面基会拉开序幕
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET实现之(自动更新)
  • @Autowired和@Resource装配
  • @synthesize和@dynamic分别有什么作用?
  • [AIGC codze] Kafka 的 rebalance 机制
  • [C++]类和对象(中)
  • [CareerCup] 6.1 Find Heavy Bottle 寻找重瓶子
  • [C语言]——函数递归
  • [ffmpeg] 定制滤波器
  • [HDU3710]Battle over Cities
  • [JMS 3] ActiveMQ实现简单的helloworld
  • [Latex] \bibitem{} | .bbl 格式参考文献转换与获得
  • [Leetcode] 寻找数组的中心索引