数据结构与算法--举例分析法- 栈的压入弹出序列
生活随笔
收集整理的這篇文章主要介紹了
数据结构与算法--举例分析法- 栈的压入弹出序列
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
舉例分析
- 與上兩篇問中畫圖方法一樣,我們可以用舉例模擬的方法思考分析復雜問題。當一眼不能看出問題的規律的時候,我們可以用幾個具體的例子來模擬一下問題的過程。這樣就和我們在程序出現問題時候的debug一樣,走一下整個流程,可以直觀的看到整個過程。
- 具體的例子還能幫助我們確保代碼的質量,在編碼完成后,可以將例子當做測試用例來模擬運行,看每一步操作后的結果和我們預期的是不是一樣的。
包含min方法的棧
- 題目:定義棧的數據結構,請在改類型中實現一個能夠得到棧的最小元素min函數。在改棧中,調用min,push,pop的時間復雜度O(1)
- 此處與普通棧不同點在于需要知道每次棧變動時候最小值。并且難點在于O(1)的時間復雜度,我們第一反應是標記最小值,這樣可以在O(1)時間得到最小元素。但是最小值出棧后,次小的值就變成最小值,此時是無法獲取這個值
- 另外一個思路,每次入棧對棧中元素進行排序,這樣能拿到最小值在棧首,會在尾。但是這樣就違背了棧的后進先出的原則就不是棧了。
- 分析到此處發現一個棧A并不能解決問題,我們用一個輔助的??臻gB,每次添加一個元素到A時候,將添加元素與最小元素比較(臨時變量保存最小元素),將最小元素添加到B,即使最小元素沒有變化仍然重復添加到B占位用。我們用如下案例分析:
| 1 | 壓入3 | 3 | 3 | 3 |
| 2 | 壓入6 | 3,6 | 3,3 | 3 |
| 3 | 壓入4 | 3,6,4 | 3,3,3 | 3 |
| 4 | 壓入45 | 3,6,4,45 | 3,3,3,3 | 3 |
| 5 | 壓入0 | 3,6,4,45,0 | 3,3,3,3,0 | 0 |
| 6 | 壓入2 | 3,6,4,45,0,2 | 3,3,3,3,0,0 | 0 |
-
如上表格,我們將最小元素每次都添加到輔助棧B中,就能保證輔助棧的棧頂是最小元素。
-
當最小元素從數據棧彈窗,我們同時操作輔助棧彈窗,這樣保證輔助棧下一個值是最小值。
-
每一步操作數據棧,輔助站都同步,可以保證輔助棧頂永遠都是數據棧中所有數據的最小值
-
實現方法是在之前文章數據結構與算法–簡單棧實現及其應用基礎上完成。實現如下:
棧的壓入,彈出序列
- 題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,判斷第二個序列是否可能是棧的彈出順序,假設入站的所有數字均不相等,例如:1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是可能的一個出棧,但是4,3,5,1,2就不可能是出棧的方式
- 我們依然用案例的方法分析,如下表格分析題中兩種情況。
| 1 | 壓入1 | 1 | |
| 2 | 壓入2 | 1,2 | |
| 3 | 壓入3 | 1,2,3 | |
| 4 | 壓入4 | 1,2,3,4 | |
| 5 | 彈出 | 1,2,3 | 4 |
| 6 | 壓入5 | 1,2,3,5 | |
| 7 | 彈出 | 1,2,3 | 5 |
| 8 | 彈出 | 1,2 | 3 |
| 9 | 彈出 | 1 | 2 |
| 10 | 彈出 | 1 |
- 如上表格中每一個步驟操作,我們在第五步驟時候,彈出4,壓入5,之后持續彈出,就能得到對應的彈出序列。
- 我們用同樣的方式來遞推第二個序列
| 1 | 壓入1 | 1 | |
| 2 | 壓入2 | 1,2 | |
| 3 | 壓入3 | 1,2,3 | |
| 4 | 壓入4 | 1,2,3,4 | |
| 5 | 彈出 | 1,2,3 | 4 |
| 6 | 彈出 | 1,2 | 3 |
| 7 | 壓入5 | 1,2,5 | |
| 8 | 彈出 | 1,2 | 5 |
| 9 | 下一個彈出的是1,但是1 不在棧頂,壓棧序列已經都入棧,操作無法繼續 |
- 如上兩表格分析,入棧,出棧過程,我們可以判斷一個序列是不是棧的彈出序列有如下規律:
- 如果下一個彈出的數字正好是棧頂數字,那么直接彈出
- 如果下一個彈出的數字不在棧頂,我們吧壓棧序列中還沒有入棧的數字壓入輔助棧
- 持續壓入直到下一個需要彈出的數字壓入棧頂位置
- 如果所有數字都壓入了棧但是還沒找到下一個彈出的數字,那么該序列不存在一個彈出序列。
- 綜上有如下實現:
- 以上兩個問題都是比較復雜的問題,并且需要多個步驟分析才能得出結果,初看時候很少有思路的,這個時候,我們通過舉例分析,一步一步來看,當最后一步符合,或者卡在某一個步驟時候,我們此時往往能從當前的狀態看出解題的思路。
上一篇:數據結構與算法–解決問題的方法-順時針打印矩陣
下一篇:數據結構與算法–廣度優先打印二叉樹
總結
以上是生活随笔為你收集整理的数据结构与算法--举例分析法- 栈的压入弹出序列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iphone14有没有指纹解锁
- 下一篇: 笨蛋测试的游戏攻略