1. 程式人生 > 實用技巧 >劍指21.棧的壓入、彈出序列

劍指21.棧的壓入、彈出序列

題目描述

輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否可能為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列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; } }