Java算法之棧和隊(duì)列

基本概念

棧(stack)在計(jì)算機(jī)科學(xué)中是限定僅在表尾進(jìn)行插入或刪除操作的線性表。棧是一種數(shù)據(jù)結(jié)構(gòu),它按照后進(jìn)先出的原則存儲(chǔ)數(shù)據(jù),先進(jìn)入的數(shù)據(jù)被壓入棧底,最后的數(shù)據(jù)在棧頂,需要讀數(shù)據(jù)的時(shí)候從棧頂開始彈出數(shù)據(jù)。棧是只能在某一端插入和刪除的特殊線性表。用桶堆積物品,先堆進(jìn)來的壓在底下,隨后一件一件往上堆。取走時(shí),只能從上面一件一件取。讀和取都在頂部進(jìn)行,底部一般是不動(dòng)的。棧就是一種類似堆積物品的數(shù)據(jù)結(jié)構(gòu),進(jìn)行刪除和插入的一端稱棧頂,另一端稱棧底。插入一般稱為進(jìn)棧,刪除則稱為退棧。 棧也稱為后進(jìn)先出表。

代碼

public class MyStack {
    //底層實(shí)現(xiàn)是一個(gè)數(shù)組
    private long[] arr;
    // 數(shù)組下標(biāo)
    private int top;

    /**
     * 默認(rèn)構(gòu)造方法
     */
    public MyStack() {
        arr = new long[10];
        top = -1;
    }

    /**
     * 帶參數(shù)的構(gòu)造方法
     *
     * @param maxSize 數(shù)組的初始化長度
     */
    public MyStack(int maxSize) {
        arr = new long[maxSize];
        top = -1;
    }

    /**
     * 添加數(shù)據(jù)(壓棧)
     *
     * @param value 添加的數(shù)值
     */
    public void push(int value) {
        // ++top后top由-1變?yōu)榱?,即第一個(gè)值添加到arr[0]的位置
        arr[++top] = value;
    }

    /**
     * 移除數(shù)據(jù)
     *
     * @return
     */
    public long pop() {
        return arr[top--];
    }

    /**
     * 查看棧頂數(shù)據(jù)
     *
     * @return
     */
    public long peek() {
        return arr[top];
    }

    /**
     * 判斷是否為空
     *
     * @return
     */
    public boolean isEmpty() {
        return top == -1;
    }

    /**
     * 判斷是否滿了
     *
     * @return
     */
    public boolean isFull() {
        return top == arr.length - 1;
    }
}

測試

public class TestMyStack {
    public static void main(String[] args) {
        MyStack ms = new MyStack(4);
        ms.push(0);
        ms.push(1);
        ms.push(2);
        ms.push(3);
        System.out.println(ms.isEmpty());
        System.out.println(ms.isFull());
        System.out.println(ms.peek());
        while (!ms.isEmpty()){
            System.out.print(ms.pop()+" ");
        }
        System.out.println();
        System.out.println(ms.isEmpty());
        System.out.println(ms.isFull());
    }
}

結(jié)果

false
true
3
3 2 1 0 
true
false

從結(jié)果中可以看到,往棧中壓入數(shù)據(jù)的順序(0,1,2,3)和彈出數(shù)據(jù)的順序(3,2,1,0)剛好相反。

隊(duì)列

基本概念

隊(duì)列的操作是在兩端進(jìn)行的,其中一端只能進(jìn)行插入,該端稱為隊(duì)列的隊(duì)尾,而另一端只能進(jìn)行刪除,該端稱為隊(duì)列的隊(duì)首。
隊(duì)列在我們?nèi)粘I钪薪?jīng)常碰到,例如,排隊(duì)買東西,誰先來,誰先買,買完就走,誰后來,誰在隊(duì)的最后面排隊(duì)。隊(duì)列的運(yùn)算規(guī)則是FIFO(first in first out),或者叫做先進(jìn)先出

代碼

public class MyQueue {
    //底層實(shí)現(xiàn)是一個(gè)數(shù)組
    private long[] arr;
    //有效數(shù)據(jù)大小
    private int elements;
    //隊(duì)頭
    private int front;
    //隊(duì)尾
    private int end;

    /**
     * 默認(rèn)的無參構(gòu)造
     */
    public MyQueue() {
        arr = new long[10];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 帶參數(shù)的構(gòu)造方法
     *
     * @param maxSize
     */
    public MyQueue(int maxSize) {
        arr = new long[maxSize];
        elements = 0;
        front = 0;
        end = -1;
    }

    /**
     * 從隊(duì)尾插入數(shù)據(jù)
     *
     * @param value
     */
    public void insert(long value) {
        if (end == arr.length - 1) {
            end = -1;
        }
        //每次都從隊(duì)尾插入數(shù)據(jù)
        arr[++end] = value;
        elements++;
    }

    /**
     * 從隊(duì)頭刪除數(shù)據(jù)
     *
     * @return
     */
    public long remove() {
        long value = arr[front++];
        if (front == arr.length) {
            front = 0;
        }
        elements--;
        return value;
    }

    /**
     * 從隊(duì)頭查看數(shù)據(jù)
     *
     * @return
     */
    public long peek() {
        return arr[front];
    }

    /**
     * 判斷隊(duì)列是否為空
     *
     * @return
     */
    public boolean isEmpty() {
        return elements == 0;
    }

    /**
     * 判斷隊(duì)列是否滿了
     *
     * @return
     */
    public boolean isFull() {
        return elements == arr.length;
    }
}

測試

public class TestMyqueue {
    public static void main(String[] args) {
        MyQueue mq = new MyQueue(4);
        mq.insert(0);
        mq.insert(1);
        mq.insert(2);
        mq.insert(3);
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
        System.out.println(mq.peek());
        while (!mq.isEmpty()){
            System.out.print(mq.remove()+" ");
        }
        System.out.println();
        System.out.println(mq.isEmpty());
        System.out.println(mq.isFull());
    }
}

結(jié)果

false
true
0
0 1 2 3 
true
false

從結(jié)果中可以看到,往隊(duì)列中添加數(shù)據(jù)的順序(0,1,2,3)和移除數(shù)據(jù)的順序(0,1,2,3)相同。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容