數據結構:隊列的java實現以及優化

隊列

隊列是一種先進先出,後進後出的數據結構。
如果用數組的基本數據結構實現的話,普通的隊列只能入列的元素數量爲數組的大小,不管是否已經出列。

/**
 * 隊列:先入先出,後入後出
 * 最多隻能入列maxSize個元素,不管是否已經出列
 */
public class Queue {

    private int maxSize; // 隊列的最大容量
    private int first = -1; // 第一個成員的index
    private int last = 0; // 最後一個成員的index +1
    private String[] arr;

    public Queue(int maxSize){
        this.maxSize = maxSize;
        arr = new String[maxSize];
    }

    public String take(){
        if (first+1 == last){
            System.out.println("隊列爲空,無法出列");
            return null;
        }

        first ++;
        String e = arr[first];
        return e;
    }

    public void add(String e){
        if (last == maxSize){
            System.out.println("隊列已滿,無法添加");
            return;
        }

        arr[last] = e;
        last ++;
    }
}

環形隊列

基於上面說到的普通隊列的缺點,我們可以進行優化——環形隊列,讓隊列可以同時存在數組大小的元素數量,不管之前是否已經出列。

/**
 * 環形隊列:在隊列可以同時存在maxSize個元素,不管之前已經出列了多少元素
 */
public class CycleQueue {

    private int maxSize; // 隊列的最大容量
    private int first = -1; // 第一個成員的index
    private int last = 0; // 最後一個成員的index +1
    private String[] arr;

    public CycleQueue(int maxSize){
        this.maxSize = maxSize;
        arr = new String[maxSize];
    }

    public void add(String e){
        if (last-first == maxSize+1){
            System.out.println("隊列已滿,無法添加");
            return;
        }

        arr[last%maxSize] = e;
        last ++;
    }

    public String take(){
        if (first == last-1){
            System.out.println("隊列爲空,無法出列");
            return null;
        }

        first ++;
        String e = arr[first%maxSize];
        return e;

    }
}

測試

在這裏插入圖片描述
測試代碼如下:

public class Test {
    public static void main(String[] args) {
        System.out.println("====普通隊列測試");
        queueTest();
        System.out.println("====環形隊列測試");
        cycleQueueTest();
    }

    public static void queueTest(){
        Queue queue = new Queue(10);

        queue.add("a");
        queue.add("b");
        queue.add("c");
        System.out.println(queue.take());
        System.out.println(queue.take());
        queue.add("d");
        System.out.println(queue.take());
        System.out.println(queue.take());
    }

    public static void cycleQueueTest(){
        CycleQueue cycleQueue = new CycleQueue(2);
        cycleQueue.add("a");
        cycleQueue.add("b");
        System.out.println(cycleQueue.take());
        System.out.println(cycleQueue.take());
        cycleQueue.add("c");
        cycleQueue.add("d");
        cycleQueue.add("e");
        System.out.println(cycleQueue.take());
        System.out.println(cycleQueue.take());
    }
}

完整代碼的已上傳至GitHub

歡迎關注同名公衆號:“我就算餓死也不做程序員”。
交個朋友,一起交流,一起學習,一起進步。在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章