劍指21.棧的壓入、彈出序列
阿新 • • 發佈:2020-08-12
題目描述
輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)思路
建立一個輔助棧,把輸入的第一個序列中的數字依次壓入該輔助棧,並按照第二個序列的順序依次從該棧中彈出數字。
- 如果下一個彈出的數字剛好是棧頂數字,那麼直接彈出;
- 如果下一個彈出的數字不在棧頂,則把壓棧序列中還沒有入棧的數字壓入輔助棧,直到把下一個需要彈出的數字壓入棧頂為止;
- 如果所有數字都壓入棧後仍然沒有找到下一個彈出數字,那麼該序列不可能是一個彈出序列。
參考程式碼
import java.util.ArrayList; import java.util.Stack; public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { if (pushA.length != popA.length) return false; if (pushA.length == 0) return true; Stack<Integer> stack = new Stack<>(); stack.push(pushA[0]); //輔助棧初始化 int index = 1; for (int i = 0; i < popA.length; i++){ while (stack.peek() != popA[i] && index < pushA.length){ stack.push(pushA[index++]); } if (stack.peek() == popA[i]){ stack.pop();continue; } return false; } return true; } }