免責聲明,本文內容大多是對數據結構與算法之美課程的學習筆記,內容上面有很多相似之處。也不太適合初學者去直接學習和掌握,僅供有算法經驗的同學提供一些,快速回顧算法知識的支持
引入問題:如何實現瀏覽器的前進後退功能?
如何理解棧?
後進者先出,先進者後出,這個就是典型的“棧”結構
當某個數據集合只設計在一端插入和刪除數據,並且滿足後進先出的特性,我們就應該首選“棧”這種數據結構
如何實現一個棧?
用 數組實現的叫順序棧
用鏈表實現的鏈式棧
// 基於數組實現的順序棧
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裏面的堆棧跟我們說的棧是一回事麼?