1. 程式人生 > 實用技巧 >輸入兩個整數序列,第一個序列表示棧的壓入順序, 請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。 例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列, 但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

輸入兩個整數序列,第一個序列表示棧的壓入順序, 請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。 例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列, 但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

思路 根據出棧順序模擬一次入棧
入棧元素 等於出棧順序第一個時就 該元素就可以出棧了
比如 入12345 出棧順序45321
入1 出棧順序第一個是4嘛 說明只有入到4才會出啊 -》
4
3
2
1 -》入到4了 相等那就出-》
3
2
1繼續正常入
5
3
2
1 5對上了5321那就出啊
-》3
2
1
如此迴圈下去 只要入棧又全出那就說明順序是對的
然後呢我踩了3個坑
1java.lang.ArrayIndexOutOfBoundsException(陣列越界)處理
2Exception in thread "main" java.util.EmptyStackException
3if判斷不周全 該用while的

import java.util.ArrayList;
import java.util.Stack;
/*
輸入兩個整數序列,第一個序列表示棧的壓入順序,
請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。
例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,
但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)

思路 根據出棧順序模擬一次入棧
入棧元素 等於出棧順序第一個時就 該元素就可以出棧了
比如 入12345 出棧順序45321
入1 出棧順序第一個是4嘛 說明只有入到4才會出啊 -》
                                         4
                                         3
                                         2
                                         1 -》入到4了 相等那就出-》
                                                                3
                                                                2
                                                                1繼續正常入
                                                                            5
                                                                            3
                                                                            2
                                                                            1 5對上了5321那就出啊
                                                                              -》3
                                                                                 2
                                                                                 1
                                                                                 如此迴圈下去 只要入棧又全出那就說明順序是對的
 然後呢我踩了3個坑
 1java.lang.ArrayIndexOutOfBoundsException(陣列越界)處理
 2Exception in thread "main" java.util.EmptyStackException
 3if判斷不周全 該用while的
 
*/ public class t21 { public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { int length = popA.length; Stack<Integer> sta = new Stack<>(); int i=0,j=0; while (i<length){ // 1java.lang.ArrayIndexOutOfBoundsException(陣列越界)處理 不應該是<=的
sta.push(pushA[i]); while (!sta.isEmpty() && sta.peek()==popA[j]){ //這個while迴圈原本只寫了一個if判斷 導致他只判斷了一次就結束了 但是有可能會出棧幾個元素的所以錯了 //這裡應該再加一個判斷條件 就是棧不能為空 或者控制 j(出棧)的總次數不能多於length j<lengthj從0開始的{j < len&& sta.peek()==popA[j]} 否則他就會迴圈多次但是棧是null 就會報錯 j++; sta.pop(); } i++; } return sta.isEmpty(); } } }