手动实现队列

218 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情

介绍

容器类是日常开发中经常使用的一种类,不同的类与不同的数据结构相关,其中队列是一种较为特殊的类,队列中的元素以 “先进先出” 的方式获取。本次我们将尝试使用数组作为底层,实现一个具有队列特点,且功能完善的类 Queue

涉及到的知识点有:

数组,面向对象,类和对象,包。

准备

1.建立两个类,

一个Queue.java,一个TestQueue.java

2.分析:

我们需要

  1. 创建一个名为 element 的 int[] 类型的属性,保存队列中的 int 值。将 element 初始化为长度 8 的数组。

  2. 创建一个名为 size 的属性,保存队列中的元素个数。

  3. 方法 enqueue(int v),用于将 v 加人到队列中。若存入的元素致使个数超出数组限制,则需要将 element 数组的容量扩展至从前容量的两倍。

  4. 方法 dequeue(),用于从队列中移除元素并返回该元素。(如果一个元素从数组的开始部分移除,你需要将数组中的所有元素往左边改变一个位置。)

提示:

  1. 方法 enqueue(int v) 在执行时要判断队列内的元素个数,若存入的元素致使个数超出数组限制,则需要将 element 数组的容量扩展至从前容量的两倍。
  2. 方法 dequeue() 取出并移除元素时需要从 element 数组的起始位置开始取出,因此每次取出都需要将数组内的剩余元素全部向前移动一位。 test:代码如下
public static void main(String[] args) {
    // 创建队列
    Queue queue = new Queue();
    // 存 0-20 共 21 个数字
    for(int i = 0 ; i <= 20 ; i++){
        queue.enqueue(i);
    }
    // 取出所有元素
    while (!queue.empty()){
        System.out.println(queue.dequeue());
    }
}

queue里面方法有:

public Queue(){
   int[] element=new int[7];
}

为啥是7?:数组下标从0开始

enqueue(int v),用于将 v 加入到队列中

public void enqueue(int v){
    test=element;
    int high=element.length;
    if(size<high){
        element[size]=v;
        size++;
    }else{
        element=new int[2*high];
        for(int i=0;i<size;i++){
            element[i]=test[i];
        }
        element[size]=v;
        size++;
    }
}

方法 empty(),如果队列是空的话,该方法返回 true。

public boolean empty(){
    if(size==0){
        return true;
    }else{
        return false;
    }
}
public int getSize() {
    return size;
}

然后就是最最关键的,取数据了。大家都知道队列是先入先出,那么我们这个题里面就会从element【0】开始出队列,每次都是出第一个,然后把后面数据前移一位。

最开始我没有想到从0开始输出,我直接

int h=0;
    public int dequeue(){
//int a=element[0];

int a=element[h];
        h++;
        return a;
//return a;
    }

image.png

当然这个是有问题做法,然后我大概知道了。这个时候我们队列里面有0-20的数据,但是因为自动内存扩张,目前有32为,只有21个数据,还有11个都是0.

这样说来,如果我每次取element[0],然后把element[i]变成element【i+1】,就实现了取出第一个数,那么我们的size需要重新返回。0不算size。

getsize修改成

public int getSize() {
//        return size;
        int i=0;
        for(int j=1;j<element.length;j++){
            if(element[i]!=0){
                i++;
            }
        }
        return i;
    }

为啥从1开始,因为0对应位置,我们赋值就是0

取出:和上面一样的,但是如果对应值是0,我们就跳过 for(){

if(element[i]!=0){

h=element【i】;

size--;

} }

image.png