Java實現一個下壓棧(棧)

最近在開始看《算法第四版》,剛學習了兩天,感覺還是收獲很大。

照著書上實現了一個下壓棧:

定容定類型的棧

棧的結構特點是先進先出,這里使用String數據類型,學習過數據結構的話應該不難寫出下面的基礎代碼,使用基本的數據類型數組來進行實現,和其他語言實現類似(C語言也是使用數組進行棧的實現)

有我們熟悉的API:isEmpty(),push()pop()

public class FixedCapacityStackOfStrings {
    private String[] a;
    private int N; // 當前的size

    public FixedCapacityStackOfStrings(int cap) {
        a = new String[cap];
    }

    public int size(){
        return N;
    }

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

    public void push(String item){
        a[N++] = item;
    }

    public String pop(){
        return a[--N];
    }
}

當然,這個實現缺點也很明顯,棧的數據類型不能變,而且不能動態(tài)增長。

那么,想要實現動態(tài)增長,就需要用到Java的泛型,之前也沒有用到泛型,也相應的練習了段簡單的泛型代碼如下,定義了一個簡單的泛型類Pair,如字面意思,存儲一對任意類型元素并有它相應方法。

public class Pair<T> {
    private T first;
    private T second;

    public Pair(){
        this.first = null;
        this.second = null;
    }

    public Pair(T first, T second){
        this.first = first;
        this.second = second;
    }

    public T getFirst(){
        return this.first;
    }

    public T getSecond(){
        return this.second;
    }

    public void setFirst(T first) {
        this.first = first;
    }

    public void setSecond(T second) {
        this.second = second;
    }
}

有了泛型的基礎,還有一個問題需要解決,就是讓它的空間可以動態(tài)的增長,寫C語言時候用到的函數是malloc()內存分配的方法,我們可以想到使用Java里的new 關鍵字。

這里要注意一個點,Java里不允許創(chuàng)建泛型數組,所以需要使用類型轉換的方法來做

// 將棧移動到新的大小為max的數組中
    public void resize(int max){
        Item[] temp = (Item[]) new Object[max];
        for (int i=0; i<N; i++){
            temp[i] = a[i];
        }
        a = temp;
    }

那么有了上面的基礎,我們就可以寫出最終版本了!

import java.util.Iterator;

public class ResizingArrayStack<Item> implements Iterable<Item> {
    private Item[] a = (Item[]) new Object[1]; // 棧元素
    private int N = 0; // 當前元素數量

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

    public int size(){
        return N;
    }

    // 將棧移動到新的大小為max的數組中
    public void resize(int max){
        Item[] temp = (Item[]) new Object[max];
        for (int i=0; i<N; i++){
            temp[i] = a[i];
        }
        a = temp;
    }

    // 入棧
    public void push(Item item){
        if (N == a.length){
            this.resize(2*a.length);
        }
        a[N++] = item;
    }

    // 出棧
    public Item pop(){
        Item item = a[--N];
        a[N] = null; // 避免對象游離
        if (N>0 && N==a.length/4){
            this.resize(a.length/2);
        }
        return a[--N];
    }

    @Override
    public Iterator<Item> iterator() {
        return new ReverseArrayIterator();
    }

    // 內部類
    public class ReverseArrayIterator implements Iterator<Item>{
        private int i = N;

        public boolean hasNext(){
            return i> 0;
        }

        public Item next(){
            return a[--i];
        }

        public void remove(){

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

相關閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,665評論 1 32
  • 《深入理解Java虛擬機》筆記_第一遍 先取看完這本書(JVM)后必須掌握的部分。 第一部分 走近 Java 從傳...
    xiaogmail閱讀 5,473評論 1 34
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構造函數創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,184評論 0 3
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數? 在 Jav...
    侯蛋蛋_閱讀 2,710評論 1 4
  • 文:呂一品 01 每個人高中的班級都有不少故事,在那個激情奮戰(zhàn)高考的歲月。青春的我們感情上開始迸發(fā),有的故事一直在...
    呂一品閱讀 395評論 0 1

友情鏈接更多精彩內容