棧與隊列簡介

棧與隊列和數組、鏈表、樹這幾種數據結構不太同樣。棧與隊列主要是作爲程序員的工具來使用,它們主要作爲構思算法的輔助工具,而不是徹底的數據存儲工具。程序員

它們的生命週期比數組那些要短得多,在程序執行期間它們纔會被建立,任務執行完就會被銷燬。web

一 棧

棧是一種只能在一端進行插入和刪除數據的數據結構,這一端被稱爲棧頂(top)。其特色簡單來說就是先進後出。棧的主要機制能夠用數組來實現,固然也能夠用鏈表來實現。算法

用數組實現棧,並完成經常使用操做——出棧、入棧、查看元素(只能查看棧頂元素)、判斷棧是否爲空等操做。數組

public class StackTest {
 
    private long[] arr;
    // 棧頂
    private int top;

    public StackTest(){
        arr = new long[10];
        top = -1;
    }
    public StackTest(int maxsize){
        arr = new long[maxsize];
        top = -1;
    }

    /**
     * 添加數據
     * @param value
     */

    public void push(int value){
        arr[++top] = value;
    }

    /**
     * 移除數據
     * @return
     */

    public long pop() {
        return arr[top--];
    }

    /**
     * 查看數據
     * @return
     */

    public long peek(){
        return arr[top];
    }
    public boolean isEmpty(){
        return top == -1;
    }

    /***
     * 判斷是否滿了
     * @return
     */

    public boolean isFull(){
        return top == arr.length-1;
    }
}

棧的全部操做複雜度都爲O(1),棧的操做不依賴棧中元素大小,棧不須要移動和比較操做。微信

二 隊列

隊列的特色是先進先出。隊列也是用數組來實現。數據結構

用數組實現隊列,並完成經常使用操做——出隊、入隊、查看元素、判斷隊列是否爲空等操做。app

public class QueueTest {

    private long[] arr;
    // 有效數據的大小
    private int elements;
    // 隊頭
    private int front;
    // 隊尾
    private int end;

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

    public QueueTest(int maxsize){
        arr = new long[maxsize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 插入數據
     * @param value
     */

    public void insert(long value){
        arr[++end] = value;
        elements++;
    }

    /**
     * 刪除數據
     * @return
     */

    public long remove(){
        elements--;
        return arr[front++];
    }

    /**
     * 查看數據,從對頭查看
     * @return
     */

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

    /**
     * 判斷是否爲空
     * @return
     */

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

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

隊列的插入、刪除等操做的複雜度都爲O(1)。編輯器

三 優先級隊列

優先級隊列和普通隊列同樣,也是一個隊頭,一個隊尾,從隊頭移除元素,優先級隊列中,數據項是有序的,這樣插入數據的時候就會根據某種規則去比較,而後插入到隊列合適的位置。所以,優先級隊列插入的複雜度爲O(N),刪除和查看元素的複雜度爲O(1)。工具

用數組實現優先級隊列,並完成經常使用操做——出隊、入隊、查看元素、判斷隊列是否爲空等操做。ui

public class FirstQueueTest {

    private long[] arr;
    // 有效數據的大小
    private int elements;
    // 隊頭
    private int front;
    // 隊尾
    private int end;

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

    public FirstQueueTest(int maxsize){
        arr = new long[maxsize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 插入數據
     * @param value
     */

    public void inser(long value){
        if(elements == 0){
            arr[++end] = value;
            elements++;
        }else{
            // 按某種規則進行比較,這裏使用value的大小比較,按從小到大排序
            for(int i = elements-1;i>=0;i--){
                if(value<arr[i]){
                    arr[i+1] = arr[i];
                    arr[i] = value;
                }else{
                    arr[i+1] = value;
                    break;
                }
            }
            elements++;
            end++;
        }
    }

    /**
     * 刪除數據
     * @return
     */

    public long remove(){
        elements--;
        return arr[front++];
    }

    /**
     * 查看數據,從對頭查看
     * @return
     */

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

    /**
     * 判斷是否爲空
     * @return
     */

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

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

四 總結

  1. 棧的特色是先進後出,棧只能查看棧頂的一個元素
  2. 隊列的特色是先進先出,只能查看隊頭的一個元素
  3. 優先級隊列插入一條元素,平均須要移動2/N個元素,所以插入的複雜度爲O(N)
  4. 棧和隊列,能夠用數組實現,也能夠用其餘數據結構實現
  5. 棧和隊列是爲了完成某些工做,手動構造的數據結構

< END >

往期精選
  Spring Boot實現定時任務的四種方式
  自定義註解詳解及應用
  一文了解Zookeeper
  短URL服務的設計以及實現
  "錕斤拷"的前世此生
  Coder,我懷疑你並不會枚舉

本文分享自微信公衆號 - Java旅途(Javatrip)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索