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