package jianzhiOffer; import java.util.Stack; /** * 輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列 * 是否爲該棧的彈出順序。假設壓入棧的全部數字均不相等。例如序列1,2, * 3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈 * 出序列,但4,3,5,1,2就不多是該壓棧序列的彈出序列。(注意:這 * 兩個序列的長度是相等的) * @author user * 思路:借用一個輔助的棧,遍歷壓棧順序,先講第一個放入棧中,這裏是1, * 而後判斷棧頂元素是否是出棧順序的第一個元素,這裏是4,很顯然1≠4,所 * 以咱們繼續壓棧,直到相等之後開始出棧,出棧一個元素,則將出棧順序 * 向後移動一位,直到不相等,這樣循環等壓棧順序遍歷完成,若是輔助棧還 * 不爲空,說明彈出序列不是該棧的彈出順序。 */ public class ch21 { public static void main(String[] args) { int[] pushA = { 1, 2, 3, 4, 5 }; // int[] popA = { 4, 5, 3, 2, 1 }; int[] popA = {4,3,5,1,2}; boolean result = IsPopOrder(pushA, popA); System.out.println(result); } public static boolean IsPopOrder(int[] pushA, int[] popA) { if (pushA.length == 0 || popA.length == 0) return false; Stack<Integer> stack = new Stack<>(); int j = 0; for (int i = 0; i < pushA.length; i++) { stack.push(pushA[i]); while(j < pushA.length && popA[j] == stack.peek()) { stack.pop(); j++; } } return stack.isEmpty() ? true : false; } }