JAVA数组实现队列(上篇)

这一篇,说一下怎么用JAVA实现一个队列,那我们就要知道什么是队列,队列是一种比较简单的数据结构,我们来看一下队列的定义:

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。

也就是我们经常所说的**“先进先出”**。

那如果我们用数组实现一个队列,我所学过的语言实现的方法似乎都大致一样。
首先我们创建一个数组是一定的,大小可以由用户来确定。
在这里插入图片描述

然后我们定义两个变量。
值都设置成-1.

如果要插入队列,就让reae++。
第一次reae就变成了0,.正好对应的就是arr【0】位置进行插入元素。
再次插入就再进行reae++,就相当于reae这个索引在逐渐向上。

如果要出队列,就让front++。
第一次front就变成了0,正好对应的也是arr【0】这个位置进行输出元素。
再次输出就再进行front++,就相当于front这个索引也在逐渐向上。

也就是说,我们用了两个初始值为-1的两个变量来作为索引,在数组中移动,从而来构建出一个先进先出的队列数据结构。

在这里插入图片描述

OK,其实不管是C语言,JAVA都可以用这种方法来模拟队列。
现在我们知道了过程是如何做到的,就可以用代码来实现了。

首先因为我们要有面向对象的思维哈,我们创建出一个队列类,由于是数组来模拟,我们就叫他ArrayQueue。

现在我们先写出他的成员变量,首先肯定要reae和front了。
然后我们说要让用户来确定容量大小,就再来一个maxSize。
然后呢,最重要的肯定是要有一个数组了呀。

 	private int maxSize;
    private int reae;
    private int front;
    private int arr[];

然后我们要用构造函数来对他们进行初始化。
构造函数应该传入一个参数来确定数组的大小

    public ArrayQueue( int size ){
        this.maxSize=size;
        this.reae = -1;
        this.front = -1;
        this.arr=new int [maxSize];
    }

然后我们在写主要方法之前,要先写出判断是否为空,是否已满的两个方法。

    //判斷是否為空
    public boolean isNull(){
        return reae==front;
    }
    //判斷是否填滿
    public boolean isEmpty(){
        return reae==maxSize-1;
    }

用两个返回值是布尔型的方法来确定。

然后我们来写入队方法:
首先我们要判断队列是否已经满了,如果满了就不能进行入队。

    public void push(int data){
        if(isEmpty()){
            System.out.println("隊列已滿,不能入队");
            return;
        }
        reae++;
        this.arr[reae]=data;
    }

如果没有满然后再进行入队操作。

然后就是出队的操作,和入队一个道理,我们先要判断队列是否为空,如果为空那么我们就不能进行出队操作。

    public void pop(){
        if(isNull()){
            System.out.println("隊列為空,不能出队");
            return;
        }
        front++;
        System.out.println(arr[front]);
    }

这样用数组模拟出一个队列就基本完成了。
我把代码整体粘贴过来。

package ArrayQueue;

public class ArrayQueue {
    private int maxSize;
    private int reae;
    private int front;
    private int arr[];

    //構造函數
    public ArrayQueue( int size ){
        this.maxSize=size;
        this.reae = -1;
        this.front = -1;
        this.arr=new int [maxSize];
    }
    //判斷是否為空
    public boolean isNull(){
        return reae==front;
    }
    //判斷是否填滿
    public boolean isEmpty(){
        return reae==maxSize-1;
    }

    //進入隊列
    public void push(int data){
        if(isEmpty()){
            System.out.println("隊列已滿,不能入队");
            return;
        }
        reae++;
        this.arr[reae]=data;
    }
    //出隊列
    public void pop(){
        if(isNull()){
            System.out.println("隊列為空,不能出队");
            return;
        }
        front++;
        System.out.println(arr[front]);
    }
}

这个时候其实这个数据结构是有问题的!
什么问题我们用测试函数来看一下。

    public static void main(String[] args) {
        ArrayQueue arrayQueue=new ArrayQueue(5);
        //入队
        for(int i=0;i<5;i++){
            arrayQueue.push(i);
        }
        //出队
        for (int i=0;i<5;i++){
            arrayQueue.pop();
        }
        arrayQueue.push(1);
        arrayQueue.pop();
    }

这里面我创建一个初始容量为5的队列。
然后循环入队。
然后再循环出队。

然后在入队一个,出队一个。
我们来看一下效果:

0
1
2
3
4
隊列已滿,不能入队
隊列為空,不能出队

可以看到前五个是没有问题的,也就是先进先出。可是这五个出队之后,我在进行入队操作就不好使了。
是因为此时的reae和front都已经指向了数组的最后一个位置。在进行reae++就已经越界了。
所以就没有办法进行入队了。

所以这个方法实现的队列,只能使用一次,仅仅只能使用一次。

OK,这一篇就只吧这个想法实现出来,优化在下一篇说。
END

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页