棧(stack)
特點:棧的最大特點就是後進先出(lifo)。對於棧中的資料來說,所有操作都是在棧的頂部完成的,只可以檢視棧頂部的元素,只能夠向棧的頂部壓⼊資料,也只能從棧的頂部彈出資料。
實現:利用乙個單鏈表來實現棧的資料結構。而且,因為我們都只針對棧頂元素進行操作,所以借用單鏈表的頭就能讓所有棧的操作在 o(1) 的時間內完成。
應用場景:在解決某個問題的時候,只要求關心最近一次的操作,並且在操作完成了之後,需要向前查詢到更前一次的操作。
如果打算用乙個陣列外加乙個指標來實現相似的效果,那麼,一旦陣列的長度發生了改變,哪怕只是在最後新增乙個新的元素,時間複雜度都不再是 o(1),而且,空間複雜度也得不到優化。
注意:棧是許多 leetcode 中等難度偏上的題目裡面經常需要用到的資料結構,掌握好它是十分必要的。
例題分析一
leetcode 第 20 題:給定乙個只包括 '(',')','','[',']' 的字串,判斷字串是否有效。
有效字串需滿足:
左括號必須用相同型別的右括號閉合。
左括號必須以正確的順序閉合。
注意:空字串可被認為是有效字串。
示例 1
輸入: "()"
輸出: true
示例 2
輸入: "(]"
輸出: false
解題思路
利用乙個棧,不斷地往裡壓左括號,一旦遇上了乙個右括號,我們就把棧頂的左括號彈出來,表示這是乙個合法的組合,以此類推,直到最後判斷棧裡還有沒有左括號剩餘。
例題分析二
第乙個溫度值是 23 攝氏度,它要經過 1 天才能等到溫度的公升高,也就是在第二天的時候,溫度公升高到 24 攝氏度,所以對應的結果是 1。接下來,從 25 度到下一次溫度的公升高需要等待 4 天的時間,那時溫度會變為 26 度。
思路 1:最直觀的做法就是針對每個溫度值向後進行依次搜尋,找到比當前溫度更高的值,這樣的計算複雜度就是 o(n2)。
但是,在這樣的搜尋過程中,產生了很多重複的對比。例如,從 25 度開始往後面尋找乙個比 25 度更高的溫度的過程中,經歷了 21 度、19 度和 22 度,而這是乙個溫度由低到高的過程,也就是說在這個過程中已經找到了 19 度以及 21 度的答案,它就是 22 度。
思路 2:可以運用乙個堆疊 stack 來快速地知道需要經過多少天就能等到溫度公升高。從頭到尾掃瞄一遍給定的陣列 t,如果當天的溫度比堆疊 stack 頂端所記錄的那天溫度還要高,那麼就能得到結果。
對第乙個溫度 23 度,堆疊為空,把它的下標壓入堆疊;
下乙個溫度 24 度,高於 23 度高,因此 23 度溫度公升高只需 1 天時間,把 23 度下標從堆疊裡彈出,把 24 度下標壓入;
同樣,從 24 度只需要 1 天時間公升高到 25 度;
21 度低於 25 度,直接把 21 度下標壓入堆疊;
19 度低於 21 度,壓入堆疊;
22 度高於 19 度,從 19 度公升溫只需 1 天,從 21 度公升溫需要 2 天;
由於堆疊裡儲存的是下標,能很快計算天數;
22 度低於 25 度,意味著尚未找到 25 度之後的公升溫,直接把 22 度下標壓入堆疊頂端;
後面的溫度與此同理。
該方法只需要對陣列進行一次遍歷,每個元素最多被壓入和彈出堆疊一次,演算法複雜度是 o(n)。
利用堆疊,還可以解決如下常見問題:
求解算術表示式的結果(leetcode 224、227、772、770)
求解直方圖裡最大的矩形區域(leetcode 84)
300分鐘搞定資料結構與演算法課程學習 2 列表
鍊錶 linkedlist 單鏈表 鍊錶中的每個元素實際上是乙個單獨的物件,而所有物件都通過每個元素中的引用字段鏈結在一起。雙鏈表 與單鏈表不同的是,雙鏈表的每個結點中都含有兩個引用字段。鍊錶的優缺點 鍊錶的優點如下 鍊錶能靈活地分配記憶體空間 能在 o 1 時間內刪除或者新增元素,前提是該元素的前...
300分鐘搞定資料結構與演算法課程學習2 佇列
佇列 queue 特點 和棧不同,佇列的最大特點是先進先出 fifo 就好像按順序排隊一樣。對於佇列的資料來說,我們只允許在隊尾檢視和新增資料,在隊頭檢視和刪除資料。實現 可以借助雙鏈表來實現佇列。雙鏈表的頭指標允許在隊頭檢視和刪除資料,而雙鏈表的尾指標允許我們在隊尾檢視和新增資料。應用場景 直觀來...
3分鐘速讀原著《Java資料結構與演算法》 二
1.簡單排序的種類 2.簡單排序之間的比較 3.小結舉例說明 在郵局經常需要去處理郵件,郵件會從下至上堆積成為乙個棧,此時處理的方式就是先處理最上面的郵件,這種方式只有能夠在合理的時間內從容處理完所有的信件,這種工作方式才不會產生太 煩,否則最底層的信件就將會永遠無法得到處理 1.棧的實戰示例 2....