基于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。

队列的示意图

基于Java数组实现循环队列的两种方法小结

实现队列时,要注意的是假溢出现象。如上图的最后一幅图。

如图所看到的的假溢出现象

基于Java数组实现循环队列的两种方法小结

解决的方法:使用链式存储,这显然能够。在顺序存储时。我们常见的解决的方法是把它首尾相接,构成循环队列。这能够充分利用队列的存储空间。

循环队列示意图:

基于Java数组实现循环队列的两种方法小结

在上图中。front指向队列中第一个元素。rear指向队列队尾的下一个位置。

但依旧存在一个问题:当front和rear指向同一个位置时,这代表的是队空还是队满呢?大家能够想象下这样的情景。

解决这种问题的常见做法是这种:

使用一标记,用以区分这样的易混淆的情形。

牺牲一个元素空间。当front和rear相等时,为空。当rear的下一个位置是front时。为满。

例如以下图:

基于Java数组实现循环队列的两种方法小结

以下我们给出循环队列,并採用另外一种方式,即牺牲一个元素空间来区分队空和队满的代码.

几个重点:

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

标签:Java,数组,循环队列
0
投稿

猜你喜欢

  • 浅谈一下Servlet的定义以及运行原理

    2023-08-14 10:50:07
  • 详解android 中animation-list 动画的应用

    2022-09-13 18:28:31
  • C#实现字体旋转的方法

    2023-01-19 06:41:40
  • ComposeDesktop开发桌面端多功能APK工具

    2022-02-11 16:57:04
  • C#中Linq的去重方式Distinct详解

    2022-01-23 03:53:36
  • synchronized背后的monitor锁实现详解

    2023-07-31 08:14:10
  • Java泛型变量如何添加约束

    2021-06-02 23:12:06
  • Android自定义实现BaseAdapter的优化布局

    2022-10-29 14:56:59
  • 如何使用HttpClient发送java对象到服务器

    2022-10-29 06:45:51
  • C#实现基于ffmpeg加虹软的人脸识别的示例

    2023-03-24 22:27:51
  • SpringAOP事务配置语法及实现过程详解

    2023-12-27 21:26:16
  • Android实现登录界面记住密码的存储

    2022-11-29 04:55:44
  • Android编程之分辨率处理相关代码段合集

    2022-09-28 07:03:16
  • 基于C#实现图片合成功能

    2022-08-23 07:21:13
  • MyBatis查询结果resultType返回值类型的说明

    2021-10-25 21:37:39
  • 基于java实现画图板功能

    2022-12-09 07:04:49
  • 详解Android Lint的原理及其使用

    2022-12-23 16:05:47
  • 浅谈C#中的值类型和引用类型

    2023-10-30 21:41:41
  • Spring实战之属性覆盖占位符配置器用法示例

    2023-02-02 00:05:30
  • java实现用户自动登录

    2023-11-10 14:38:59
  • asp之家 软件编程 m.aspxhome.com