Java數據結構與算法_隊列

Java數據結構與算法_隊列

一、隊列介紹

隊列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,隊列是一種操作受限制的線性表。進行插入操作的端稱爲隊尾,進行刪除操作的端稱爲隊頭。
在這裏插入圖片描述

二、單向隊列的實現

/**
 * @Author: slx
 * @Date: 2019/5/10 15:44
 */
public class ShuQueue {
    private Object[] queueArray;
    //隊列總大小
    private int maxSize;
    //對頭
    private int front;
    //隊尾
    private int rear;
    //隊列中元素的實際數目
    private int nItems;

    public ShuQueue(int s) {
        this.maxSize = s;
        queueArray = new Object[maxSize];
        front = 0;
        rear = -1;
        nItems = 0;
    }

    //隊列中新增數據
    public void insert(int value) {
        if (isFull()) {
            System.out.println("隊列已滿!");
        }else {
            //如果隊列尾部指向頂了,那麼循環回來,執行隊列的第一個元素
            if (rear == maxSize -1) {
                rear = -1;
            }
            //隊尾指針加1,然後在隊尾指針插入新的數據
            queueArray[++rear] = value;
            nItems++;
        }
    }

    //移除數據
    public Object remove() {
        Object removeValue = null;
        if (!isEmpty()) {
            removeValue = queueArray[front];
            queueArray[front] = null;
            front++;
            if (front == maxSize) {
                front = 0;
            }
            nItems--;
            return removeValue;
        }
        return removeValue;
    }

    //查看對頭元素
    public Object peekFront() {
        return queueArray[front];
    }

    //判斷隊列是否滿了
    public boolean isFull() {
        return (nItems == maxSize);
    }

    //判斷隊列是否爲空
    public boolean isEmpty() {
        return (nItems == 0);
    }

    //返回隊列的大小
    public int getSize() {
        return nItems;
    }
}

測試代碼:

/**
 * @Author: slx
 * @Date: 2019/5/12 20:32
 */
public class ShuQueueTest {
    public static void main(String[] args) {
        ShuQueue queue = new ShuQueue(5);
        queue.insert(1);
        queue.insert(2);
        queue.insert(3);
        queue.insert(4);
        queue.insert(5);

        System.out.println(queue.peekFront());
        queue.remove();
        System.out.println(queue.peekFront());

        queue.insert(6);
        queue.insert(7);

    }
}

結果

1
2
隊列已滿!

Process finished with exit code 0

三、優先級隊列(基於數組實現)

/**
 * @Author: slx
 * @Date: 2019/5/12 20:42
 */
public class ShuPriorityQueue {
    private int maxSize;
    private int[] priQueueArray;
    private int nItems;

    public ShuPriorityQueue(int s) {
        this.maxSize = s;
        priQueueArray = new int[maxSize];
        nItems = 0;
    }

    //插入數據
    public void insert(int value) {
        int j;
        if (nItems == 0) {
            priQueueArray[nItems++] = value;
        }else {
            j = nItems - 1;
            //選擇的排序方法是插入排序,按照從大到小的順序排列,越小的越在隊列尾部
            while (j >= 0 && value > priQueueArray[j]) {
                priQueueArray[j+1] = priQueueArray[j];
                j--;
            }
            priQueueArray[j+1] = value;
            nItems++;
        }
    }

    //移除數據,由於是按照從大到小的順序排列的,所以我們移除數據我們指針向下移動
    //被移除的地方由於是int類型的,不能設置爲null,這裏的做法是設置爲 -1
    public int remove() {
        int k = nItems - 1;
        int value = priQueueArray[k];
        priQueueArray[k] = -1;//-1表示這個位置的數據被移除了
        nItems--;
        return value;
    }

    //查看優先級最高的元素
    public int peekMin() {
        return priQueueArray[nItems-1];
    }

    //判斷是否爲空
    public boolean isEmpty() {
        return (nItems == 0);
    }

    //判斷隊列是否滿了
    public boolean isFull() {
        return (nItems == maxSize);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章