劍指Offer22 出棧序列判定問題

2021-09-26 18:57:04 字數 797 閱讀 5661

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

建立輔助棧,把輸入的第乙個序列中的數字依次壓入到該輔助棧,並按照第二個序列的順序依次從該棧中彈出數字。

例如彈出序列為4、5、3、2、1為對應的彈出序列,因此第乙個希望被彈出的數字是4,因此4需要先壓入到輔助棧裡面。壓入棧的順序由壓棧序列確定了,也就是在把4壓入進棧之前,數字1、2、3都需要先壓入到棧裡面。此時棧裡面包含4個數字,分別是1、2、3、4,其中4位於棧頂。把4彈出棧後,剩下的三個數字是 1、2和3,。接下來希望被彈出的數字是5,由於它不是棧頂數字,因此我們接著在第乙個序列中把4以後數字壓入到輔助棧中,直到壓入數字5。這個時候5位於棧頂,就可以被彈出來了。接下來希望被彈出的三個數字依次是3、2、1.由於每次操作前它們都位於棧頂,因此直接彈出即可。

綜上所述:如果下乙個彈出的數字剛好是棧頂數字,那麼直接彈出。如果下乙個彈出的數字不在棧頂,我們把壓棧序列中還沒有入棧的數字壓入輔助棧, 直到把下乙個需要彈出的數字壓入棧頂為止。如果所有的數字都壓入棧了仍沒有找到下乙個彈出的數字,那麼該序列不可能是乙個彈出序列。

public class code022 

int index=0;

for(int i=0;i}

//如果最後棧中資料沒有全部彈出,說明不是彈出序列

if(stack.isempty())else

}}

劍指offer 22 棧的壓入 彈出序列

題目 輸入兩個整型陣列,判斷第二個是不是第乙個的棧輸出序列 解法 使用佇列完成,輸出傳入棧中再輸出 public class main new int private static boolean isseq int input,int output stacks new stack 建立棧,模擬實...

劍指offer 22 棧的壓入彈出序列

輸入兩個整數序列,第乙個表示壓棧順序,判斷第二個序列是否為該棧的彈出序列?分析 include include include using namespace std class solution 棧頂不等於彈出序列頂,則跳出 if s.top pnextpop break 彈棧,第乙個序列匹配 s...

劍指offer22 棧的壓入 彈出序列

思路 建立棧,並且兩個指標指向陣列,直到pop陣列結束,或者stack空了 static boolean check int push,int pop stack.push push pushindex while stack.isempty popindex 如果pop已經結束了 if popin...