數據結構和算法學習筆記-棧

免責聲明,本文內容大多是對數據結構與算法之美課程的學習筆記,內容上面有很多相似之處。也不太適合初學者去直接學習和掌握,僅供有算法經驗的同學提供一些,快速回顧算法知識的支持

引入問題:如何實現瀏覽器的前進後退功能?

如何理解棧?

後進者先出,先進者後出,這個就是典型的“棧”結構

當某個數據集合只設計在一端插入和刪除數據,並且滿足後進先出的特性,我們就應該首選“棧”這種數據結構

如何實現一個棧?

用 數組實現的叫順序棧
用鏈表實現的鏈式棧

// 基於數組實現的順序棧
public class ArrayStack {
  private String[] items;  // 數組
  private int count;       // 棧中元素個數
  private int n;           //棧的大小

  // 初始化數組,申請一個大小爲n的數組空間
  public ArrayStack(int n) {
    this.items = new String[n];
    this.n = n;
    this.count = 0;
  }

  // 入棧操作
  public boolean push(String item) {
    // 數組空間不夠了,直接返回false,入棧失敗。
    if (count == n) return false;
    // 將item放到下標爲count的位置,並且count加一
    items[count] = item;
    ++count;
    return true;
  }
  
  // 出棧操作
  public String pop() {
    // 棧爲空,則直接返回null
    if (count == 0) return null;
    // 返回下標爲count-1的數組元素,並且棧中元素個數count減一
    String tmp = items[count-1];
    --count;
    return tmp;
  }
}

線性棧和鏈式棧的空間複雜度是O(1).時間複雜度是O(1)

支持動態擴容的順序棧

均攤時間複雜度一半都等於最好情況時間複雜度。

棧在函數調用中的應用

方法棧,棧溢出的原因?

棧在表達式求值的應用

課後思考

1.爲什麼函數調用要用棧保存臨時變量呢?
2.JVM裏面的堆棧跟我們說的棧是一回事麼?

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