データ構造(3):キューの原則と実装

完全なコードは下を引っ張っ

I.はじめに

名前がキューを示唆するように、我々は同じキュー、FIFOに住んでいるよう。

画像

上記のように、順にキューに25,16,5,9順次それぞれ25,26,5,9データのうちです。

第二に、実装プロセスと思考

実装する下部アレイを使用し、関数がデータに挿入された尾を持って、データは、データを表示する最初のチーム、最初のチームを除去され、キューが満杯であるか否かを判断し、待ち行列が空であるか否かが判定されます。

アレイの特定のセクションにストアキュー要素は、アレイは、キュー内の連続しているので、キュー・アレイにおける可変マーク位置を使用します。

1、ライティングクラスと属性

私たちは、終了インデックス変数タグのチームは、配列の最後の要素を配列インデックスでフロント変数タグのチームの最初の要素を使用して、キュー内の要素の数をマーク変数の要素を使用することができます。

画像

public class MyQueue {
    
    private Object[] arr;//存放队列元素的数组
    private int elements;//队列元素数量
    private int front;//队头元素在数组中的索引
    private int end;//队尾元素在数组中的索引
    
    
    public MyQueue() {
        arr = new Object[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    public MyQueue(int maxSize) {
        arr = new Object[maxSize];
        elements = 0;
        front = 0;
        end = -1;
    }    
}

2、キューが空であります

要素マークキュー要素の可変数はnullにゼロであります

public boolean isEmpty() {
    return elements == 0;
}

3、キューがいっぱいの場合

配列の長さと完全に等しいキュー内の要素の数

public boolean isFull() {
    return elements == arr.length;
}

図4に示すように、ヘッド素子を得るために

配列インデックスを取得front要素

public Object peek() {
    return arr[front];
}

5、チームは最初の要素を削除しました

配列インデックス除去都度front要素は、次の要素は、最初のチームになることであるfront+1、キュー内の要素の数elements-1あなたが他の正常な動作条件の場所をマークするために、変数リセットに直接最後の要素を持っている場合は、キューは何もする必要は、その後、空でない場合、考慮すべき3つのケースがあります。

public Object remove() {
    if (isEmpty()) {
        throw new RuntimeException("队列已经是空的,放心使用吧");
    }
    Object value = arr[front++];
    //如果已经是最后一个元素了,将指针重置即可
    if (elements == 1) {
        end = -1;
        front = 0;
        elements = 0;
    } else {
        elements--;
    }
    return value;
}

6、挿入

我々は継続的に利用できるキューを作成するので、次のような状況を考慮してください。

(1)ストレージ・アレイ・キュー(キューが満杯である)一杯になる、これは要素の完全な理解が容易で尾に追加することはできません。

(2)配列内のキュー要素最後に、キューの先頭から要素がアレイの尾、空きすなわち後方位置(図を参照するように移動された場合、アレイ内のキューは、連続的であるためです。 )。

public void insert(Object value) {
    //检测队列是否已经满了
    if (isFull()) {
        throw new RuntimeException("队列内元素已达到设定长度");
    }

    //如果后面没有空位置,将余下元素放到数组的头
    if (elements > 1 && end == arr.length - 1) {
        int i = 0;
        for (; i < elements; i++, front++) {
            arr[i] = arr[front];
        }
        front = 0;
        end = i-1;
    }
    //其他情况正常向后添加元素
    arr[++end] = value;
    elements++;
}

7、テスト

public static void main(String[] args) {
    MyQueue queue = new MyQueue(4);
    queue.insert(11);
    queue.insert(12);
    queue.insert(13);
    queue.insert(14);

    queue.remove();
    queue.remove();
    queue.insert(16);
    //queue.remove();
    //queue.remove();
    
    //queue.insert(19);
    //queue.insert(20);
    queue.remove();

    queue.remove();

    queue.insert(21);
    queue.insert(22);

    while (!queue.isEmpty()) {
        System.out.println(queue.remove());
    }
}

第三に、完全なコード

package com.jikedaquan.datastruct;

public class MyQueue {
    private Object[] arr;
    private int elements;//队列元素数量
    private int front;//队头元素在数组中的索引
    private int end;//队尾元素在数组中的索引

    public MyQueue() {
        arr = new Object[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    public MyQueue(int maxSize) {
        arr = new Object[maxSize];
        elements = 0;
        front = 0;
        end = -1;
    }

    //从队尾插入
    public void insert(Object value) {
        //检测队列是否已经满了
        if (isFull()) {
            throw new RuntimeException("队列内元素已达到设定长度");
        }

        //如果后面没有空位置,将余下元素放到数组的头
        if (elements > 1 && end == arr.length - 1) {
            int i = 0;
            for (; i < elements; i++, front++) {
                arr[i] = arr[front];
            }
            front = 0;
            end = i-1;
        }
        arr[++end] = value;
        elements++;

    }

    //删除数据,从队头删除
    public Object remove() {
        if (isEmpty()) {
            throw new RuntimeException("队列已经是空的,放心使用吧");
        }
        Object value = arr[front++];
        //如果已经是最后一个元素了,将指针重置即可
        if (elements == 1) {
            end = -1;
            front = 0;
            elements = 0;
        } else {
            elements--;
        }
        return value;
    }

    //查看数据,从队头查看
    public Object peek() {
        return arr[front];
    }

    //判断是否为空
    public boolean isEmpty() {
        return elements == 0;
    }

    public boolean isFull() {
        return elements == arr.length;
    }

    public static void main(String[] args) {
        MyQueue queue = new MyQueue(4);
        queue.insert(11);
        queue.insert(12);
        queue.insert(13);
        queue.insert(14);

        queue.remove();
        queue.remove();
        queue.insert(16);
//        queue.remove();
//        queue.remove();

//        queue.insert(19);
//        queue.insert(20);
        queue.remove();

        queue.remove();

        queue.insert(21);
        queue.insert(22);

        while (!queue.isEmpty()) {
            System.out.println(queue.remove());
        }
    }
}

おすすめ

転載: www.cnblogs.com/AIThink/p/11620724.html