棧及經典問題(一)

2021-10-22 17:43:30 字數 1658 閱讀 7479

棧是⼀種「先進後出」(filo, first in last out)的資料結構。

1.棧的基本操作

leetcode #面試題03.04 化棧為隊

利⽤兩個棧來實現,⼀個輸⼊棧、⼀個輸出棧。

輸⼊棧⽤於讀⼊資料。當需要輸出元素時,若輸出棧為空,則將輸⼊棧的所有元素 推送到輸出棧,然後取棧頂元素;若輸出棧⾮空,則輸出棧頂即可。

輸出棧的作⽤是對已經被反轉的序列進⾏⼆次反轉。對此感到困惑的同學可以畫圖模擬⼀下。

leetcode #844 比較含退格的字串

按照題意實現即可。

leetcode #946 驗證棧序列

被出棧的元素只有兩種可能:即將⼊棧的元素 和 當前棧頂的元素。

只需要關注出棧序列,分類討論後模擬即可。

leetcode #20 有效的括號

結論1:在任意⼀個位置上,左括號數量》=右括號數量

結論2:在最後⼀個位置上,左括號數量==右括號數量

根據上述兩個結論,程式中只需要記錄左括號和右括號的數量即可。

⼀對括號可以等價為⼀個完整的事件。左括號可以看作事件的開始、右括號可以看

作事件的結束。⽽括號序列可以看作事件與事件之間的完全包含關係。

棧可以處理具有完全包含關係的問題。

leetcode #1021 刪除最外層的括號

左括號和右括號差值為0時,代表這⼀串括號序列是獨⽴的,可以被單獨分解出來。

leetcode #1249 移除⽆效的括號

可以被匹配的括號都是有效的,⽽其他的括號都需要被刪除。

leetcode #145 ⼆叉樹的後序遍歷

遞迴做法⽐較簡單,在這⾥介紹⼀下基於迭代的做法。

技巧是使⽤兩個棧,⼀個資料棧,⼀個狀態棧。將「遍歷左⼦樹」,「遍歷右⼦樹」和「訪問根節點」三個步驟分別⽤狀態碼表⽰,列舉狀態轉移過程,使⽤有限狀態⾃動機(fsm, finite state machine)的模型來模擬遞迴過程。

leetcode #331 驗證⼆叉樹的前序序列化

思路1:每次拆掉⼀個「數字、#、#」的節點(即葉⼦結點),最後樹上的全部節點都會被拆光(即只剩⼀個「#」),能拆光的序列就是合法序列。

思路2:初始狀態有⼀個坑。每多增加⼀個數字節點,會在佔掉⼀個坑後,產⽣兩個坑,每多增加⼀個#,會減少⼀個坑。合法的⼆叉樹前序遍歷最後會剛好⽤完所有的坑。

leetcode #227 基本計算器ii

思路1:找到式⼦中優先順序最低的運算子,然後遞迴分治運算兩側的⼦式即可。

思路2:使⽤運算元棧和操作符棧輔助計算,當操作符棧遇到更低優先順序的操作符時,需要將之前更⾼級別的操作符對應的結果計算出來。

對於有括號的情況,左括號相當於提⾼了內部全部運算子的優先順序,當遇到右括號的時候需要將匹配的括號間的內容全部計算出來。

可以通過加⼀個特殊操作符的處理技巧,來額外處理結尾的數字。

leetcode #636 函式的獨佔時間

本質就是⼀道模擬題,畫⼀個線段圖能顯著地輔助理解。任務開始時進棧,上⼀個任務暫停執⾏;任務完成時出棧,恢復上⼀個任務的執⾏。

鍊錶及經典問題

鍊錶及經典問題 鍊錶及經典問題 第一周 鍊錶及經典問題 1 鍊錶的基礎知識鍊錶的結構 訪問鍊錶的時間複雜度幾種經典的鍊錶實現方法 2 鍊錶的典型應用場景 3 經典面試題鍊錶的訪問鍊錶的反轉 鍊錶的節點刪除 4 彩蛋習題及相關說明 1 鍊錶的基礎知識 鍊錶的結構 節點資料域指標域 實現方式包括位址 下...

面試經典問題及回答思路

面試過程中,面試官會向應聘者發問,而應聘者的回答將成為面試官考慮是否接受他的重要依據。對應聘者而言,了解這些問題背後的 貓膩 至關重要。本文對面試中經常出現的一些典型問題進行了整理,並給出相應的回答思路和參 讀者無需過分關注分析的細節,關鍵是要從這些分析中 悟 出面試的規律及回答問題的思維方式,達到...

C 經典問題總結一

no.1c 是託管語言,那麼是不是說明使用c 就能保證不會出現記憶體洩露以及其他資源的洩漏?如果不是,那麼在哪些情況下可能出現洩漏?答案 c 不能保證沒有資源洩漏。比如如下幾種情況可能會造成資源洩漏 1 呼叫native code,比如用p invoke或者呼叫com 2 讀寫檔案時的,沒有及時cl...