一、问题描述
给定两个数组,一个进栈顺序,一个出栈顺序。判定出栈数组的出栈顺序是不是有可能的。
二、Code
1 package algorithm; 2 3 import java.util.ArrayDeque; 4 import java.util.Deque; 5 6 /** 7 * Created by adrian.wu on 2019/5/30. 8 */ 9 public class StackPopOrderJudge { 10 /* 11 思路: 12 1、整体思路用一个辅助栈还原入栈元素的顺序,并比较两者是否一致 13 2、如果第一个出栈元素并非最后一个入栈元素,则这个出战元素之前的元素不可能先于它出栈,因此把这个元素即之前的元素都压入栈 14 3、上述步骤之后,如果出栈元素并非入栈栈顶元素,则其是先pop出去了,因此直接压人辅助栈 15 4、重复上述步骤,并比较辅助栈和压入栈的元素,遇到相同则pop 16 5、观察最后入栈元素和辅助栈是否都为空,为空则正确,不为空则False 17 */ 18 19 public static boolean isPopOrder(int[] in, int[] out) { 20 int n = out.length; 21 int nextPop = 0, nextPush = 0; 22 Deque<Integer> deque = new ArrayDeque<>(); 23 24 25 while (nextPop != n) { 26 while (deque.isEmpty() || deque.peek() != out[nextPop]) { 27 if (nextPush == n) break; 28 deque.push(in[nextPush++]); 29 } 30 31 if (!deque.isEmpty() && deque.peek() != out[nextPop++]) break; 32 deque.pop(); 33 } 34 return nextPop == n && deque.isEmpty(); 35 } 36 }