日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

数据结构与算法--举例分析法- 栈的压入弹出序列

發布時間:2023/12/4 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构与算法--举例分析法- 栈的压入弹出序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

舉例分析

  • 與上兩篇問中畫圖方法一樣,我們可以用舉例模擬的方法思考分析復雜問題。當一眼不能看出問題的規律的時候,我們可以用幾個具體的例子來模擬一下問題的過程。這樣就和我們在程序出現問題時候的debug一樣,走一下整個流程,可以直觀的看到整個過程。
  • 具體的例子還能幫助我們確保代碼的質量,在編碼完成后,可以將例子當做測試用例來模擬運行,看每一步操作后的結果和我們預期的是不是一樣的。

包含min方法的棧

  • 題目:定義棧的數據結構,請在改類型中實現一個能夠得到棧的最小元素min函數。在改棧中,調用min,push,pop的時間復雜度O(1)
  • 此處與普通棧不同點在于需要知道每次棧變動時候最小值。并且難點在于O(1)的時間復雜度,我們第一反應是標記最小值,這樣可以在O(1)時間得到最小元素。但是最小值出棧后,次小的值就變成最小值,此時是無法獲取這個值
  • 另外一個思路,每次入棧對棧中元素進行排序,這樣能拿到最小值在棧首,會在尾。但是這樣就違背了棧的后進先出的原則就不是棧了。
  • 分析到此處發現一個棧A并不能解決問題,我們用一個輔助的??臻gB,每次添加一個元素到A時候,將添加元素與最小元素比較(臨時變量保存最小元素),將最小元素添加到B,即使最小元素沒有變化仍然重復添加到B占位用。我們用如下案例分析:
步驟操作數據棧A輔助棧B最小值
1壓入3333
2壓入63,63,33
3壓入43,6,43,3,33
4壓入453,6,4,453,3,3,33
5壓入03,6,4,45,03,3,3,3,00
6壓入23,6,4,45,0,23,3,3,3,0,00
  • 如上表格,我們將最小元素每次都添加到輔助棧B中,就能保證輔助棧的棧頂是最小元素。

  • 當最小元素從數據棧彈窗,我們同時操作輔助棧彈窗,這樣保證輔助棧下一個值是最小值。

  • 每一步操作數據棧,輔助站都同步,可以保證輔助棧頂永遠都是數據棧中所有數據的最小值

  • 實現方法是在之前文章數據結構與算法–簡單棧實現及其應用基礎上完成。實現如下:

/*** 包含min方法的棧實現* @author liaojiamin* @Date:Created in 16:02 2021/4/2*/ public class MyStackWithMin {private static MyStack dataStack = new MyStack();private static MyStack minStack = new MyStack();public static void push(int num){if(dataStack.size() == 0 && minStack.size() == 0){dataStack.push(num);minStack.push(num);}else {dataStack.push(num);if((int)minStack.getTop() > num){minStack.push(num);}else {minStack.push(minStack.getTop());}}}public static int pop(){if(dataStack.size() == 0 || minStack.size() == 0){return Integer.MAX_VALUE;}minStack.pop();return (int)dataStack.pop();}public static int min(){if(minStack.size() == 0){return Integer.MAX_VALUE;}return (int)minStack.pop();}public static void main(String[] args) {Random random = new Random();for (int i = 0; i < 100; i++) {int temp = random.nextInt(100);System.out.println(temp);push(temp);}System.out.println(min());} }

棧的壓入,彈出序列

  • 題目:輸入兩個整數序列,第一個序列表示棧的壓入順序,判斷第二個序列是否可能是棧的彈出順序,假設入站的所有數字均不相等,例如:1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是可能的一個出棧,但是4,3,5,1,2就不可能是出棧的方式
  • 我們依然用案例的方法分析,如下表格分析題中兩種情況。
步驟操作棧彈出數字
1壓入11
2壓入21,2
3壓入31,2,3
4壓入41,2,3,4
5彈出1,2,34
6壓入51,2,3,5
7彈出1,2,35
8彈出1,23
9彈出12
10彈出1
  • 如上表格中每一個步驟操作,我們在第五步驟時候,彈出4,壓入5,之后持續彈出,就能得到對應的彈出序列。
  • 我們用同樣的方式來遞推第二個序列
步驟操作棧彈出數字
1壓入11
2壓入21,2
3壓入31,2,3
4壓入41,2,3,4
5彈出1,2,34
6彈出1,23
7壓入51,2,5
8彈出1,25
9下一個彈出的是1,但是1 不在棧頂,壓棧序列已經都入棧,操作無法繼續
  • 如上兩表格分析,入棧,出棧過程,我們可以判斷一個序列是不是棧的彈出序列有如下規律:
    • 如果下一個彈出的數字正好是棧頂數字,那么直接彈出
    • 如果下一個彈出的數字不在棧頂,我們吧壓棧序列中還沒有入棧的數字壓入輔助棧
    • 持續壓入直到下一個需要彈出的數字壓入棧頂位置
    • 如果所有數字都壓入了棧但是還沒找到下一個彈出的數字,那么該序列不存在一個彈出序列。
    • 綜上有如下實現:
/*** 存在棧A的入棧系列S,判斷給出的序列B是否可能是A 的出序列,例如1,2,3,4,5 入棧,4,5,3,2,1 出棧* @author liaojiamin* @Date:Created in 16:54 2021/4/2*/ public class ValidateIsPopOrder {public static boolean validateIsPopOrder(int[] orderPush, int[] orderPop){if(orderPush == null || orderPop == null){return false;}if(orderPush.length != orderPop.length){return false;}MyStack myStack = new MyStack();int length = orderPop.length;int pushPosition = 0;int popPosition = 0;while (pushPosition < length || popPosition < length){while (myStack.size() > 0 && (int)myStack.getTop() == orderPop[popPosition] && popPosition < length){myStack.pop();popPosition++;}if(pushPosition < length){myStack.push(orderPush[pushPosition]);pushPosition ++;}if(pushPosition == length && myStack != null && (int)myStack.getTop() != orderPop[popPosition]){return false;}}return !(myStack.size() != 0);}public static void main(String[] args) {int[] push = {1,2,3,4,5}; // int[] pop = {4,5,3,2,1}; // int[] pop = {3,2,1,5,4};int[] pop = {4,3,5,1,2};System.out.println(validateIsPopOrder(push, pop));} }
  • 以上兩個問題都是比較復雜的問題,并且需要多個步驟分析才能得出結果,初看時候很少有思路的,這個時候,我們通過舉例分析,一步一步來看,當最后一步符合,或者卡在某一個步驟時候,我們此時往往能從當前的狀態看出解題的思路。

上一篇:數據結構與算法–解決問題的方法-順時針打印矩陣
下一篇:數據結構與算法–廣度優先打印二叉樹

總結

以上是生活随笔為你收集整理的数据结构与算法--举例分析法- 栈的压入弹出序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。