基于Java数组实现循环队列的两种方法小结
作者:yjbjingcha 发布时间:2023-06-30 16:09:01
用java实现循环队列的方法:
1、添加一个属性size用来记录眼下的元素个数。
目的是当head=rear的时候。通过size=0还是size=数组长度。来区分队列为空,或者队列已满。
2、数组中仅仅存储数组大小-1个元素,保证rear转一圈之后不会和head相等。也就是队列满的时候。rear+1=head,中间刚好空一个元素。
当rear=head的时候。一定是队列空了。
队列(Queue)两端同意操作的类型不一样:
能够进行删除的一端称为队头,这样的操作也叫出队dequeue;
能够进行插入的一端称为队尾,这样的操作也叫入队enqueue。
队列的示意图
实现队列时,要注意的是假溢出现象。如上图的最后一幅图。
如图所看到的的假溢出现象
解决的方法:使用链式存储,这显然能够。在顺序存储时。我们常见的解决的方法是把它首尾相接,构成循环队列。这能够充分利用队列的存储空间。
循环队列示意图:
在上图中。front指向队列中第一个元素。rear指向队列队尾的下一个位置。
但依旧存在一个问题:当front和rear指向同一个位置时,这代表的是队空还是队满呢?大家能够想象下这样的情景。
解决这种问题的常见做法是这种:
使用一标记,用以区分这样的易混淆的情形。
牺牲一个元素空间。当front和rear相等时,为空。当rear的下一个位置是front时。为满。
例如以下图:
以下我们给出循环队列,并採用另外一种方式,即牺牲一个元素空间来区分队空和队满的代码.
几个重点:
1、front指向队头。rear指向队尾的下一个位置。
2、队为空的推断:front==rear;队为满的推断:(rear+1)%MAXSIZE==front。
import java.io.*;
public class QueueArray {
Object[] a; //对象数组,队列最多存储a.length-1个对象
int front; //队首下标
int rear; //队尾下标
public QueueArray(){
this(10); //调用其他构造方法
}
public QueueArray(int size){
a = new Object[size];
front = 0;
rear =0;
}
/**
* 将一个对象追加到队列尾部
* @param obj 对象
* @return 队列满时返回false,否则返回true
*/
public boolean enqueue(Object obj){
if((rear+1)%a.length==front){
return false;
}
a[rear]=obj;
rear = (rear+1)%a.length;
return true;
}
/**
* 队列头部的第一个对象出队
* @return 出队的对象,队列空时返回null
*/
public Object dequeue(){
if(rear==front){
return null;
}
Object obj = a[front];
front = (front+1)%a.length;
return obj;
}
public static void main(String[] args) {
QueueArray q = new QueueArray(4);
System.out.println(q.enqueue("张三"));
System.out.println(q.enqueue("李斯"));
System.out.println(q.enqueue("赵五"));
System.out.println(q.enqueue("王一"));//无法入队列,队列满
for(int i=0;i<4;i++){
System.out.println(q.dequeue());
}
}
}
来源:https://www.cnblogs.com/yjbjingcha/p/7239085.html


猜你喜欢
- 1、实现原理不同过滤器和 * 底层实现方式大不相同,过滤器 是基于函数回调的, * 则是基于Java的反射机制( * )实现的。1、拦
- 在之前的博客使用SpringMVC创建Web工程并使用SpringSecurity进行权限控制的详细配置方法 中,我们描述了如何配置一个基于
- 有时间我们在使用多线程的时候,需要取消线程的执行,可以使用CancellationTokenSource来取消对Task开辟多线程的取消如下
- 本文实例讲述了C#发送内置图片html格式邮件的方法。分享给大家供大家参考。具体如下:下面的代码用于发送html格式的邮件,并且可以将图片附
- 工作中一直都是一个人奋战一人一个项目,使用maven管理,看这个也挺好,但是总感觉没有充分发挥maven的功能,于是研究了一下这个,网上关于
- 智能终端上的游戏目前风头正劲,试问哪个智能手机上没有几款企鹅公司出品的游戏呢!之前从未涉猎过游戏开发,但知道游戏开发前要挑选一款合适的游戏引
- 本文为大家分享了Unity3D飞机大战游戏第一部分的实现代码,供大家参考,具体内容如下让飞机可以发射 * 准备工作:1、将 * 设置成预制体2、
- 本文实例讲述了Android编程之页面切换测试。分享给大家供大家参考。具体分析如下:一、软件平台:win7 + eclipse + sdk二
- 项目中有个要求,对上传服务器的图片大小进行判断,大于500k的图片要进行压缩处理,让其小于500k后在上传。可以通过java api的Ima
- 本文为大家分享了C#基于Socket套接字的网络通信封装代码,供大家参考,具体内容如下摘要之所以要进行Socket套接字通信库封装,主要是直
- PC上的浏览器会弹出证书错误的对话框,提示你是否要无视错误继续浏览。实际上在WebView里也可以这样做,以实现加载证书有问题的页面。Web
- Spring Boot 最主要的特性就是AutoConfig(自动配置),而对于我们这些使用者来说也就是各种starter,Spring B
- 用法1 为原始类型扩展方法先说一下,this 后面跟的类型,就是要拓展方法的类型。注意要写在静态类中的静态方法,不然有些情况下访问/// &
- 需求描述一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用GUI界面实现项目结构如下图一、实体FiveChess类提供五子棋
- java 抽象类的实例详解前言:什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住。但是,就像老人家所说的,一切反动派都
- activity动画方式在AndroidMenifest中添加activity的动画属性windowAnimationStyle <i
- 本文实例讲述了Android编程实现系统重启与关机的方法。分享给大家供大家参考,具体如下:最近在做个东西,巧合碰到了sharedUserId
- 本文实例讲述了C#实现读写ini文件类。分享给大家供大家参考。具体如下:这个C#类封装了对INI配置文件进行操作所需的各种函数,包括读取键值
- 这里使用Spring Boot 2.7.4版本,对应Spring Security 5.7.3版本本文样例代码地址: spring-secu
- 一、什么是组合模式定义:将对象以树形结构组织起来,以达成“部分-整体”的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。动机(Mo