栈的压入、弹出序列
来源:牛客网 《剑指offer》
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
pushA={1,2,3,4,5}
popA={4,5,3,1,2}
popB={4,3,5,1,2}
先看popA,第一个是4,因此需要先将1,2,3,4都入栈,然后弹出4,此时top=3. 下一个是5,不等于top,因此需要把pushA中的下一个元素入栈,然后比较新的是否等于5. 若等于,则出栈;若不等于,则继续从pushA中将数字压栈。终止条件是栈为空或pushA数组遍历完成了。
1 public boolean IsPopOrder(int [] pushA,int [] popA) { 2 if (pushA.length==0 || popA.length==0) return false; 3 if (pushA.length!=popA.length) return false; 4 5 Stack<Integer> stack = new Stack<Integer>(); 6 stack.push(pushA[0]); // autoboxing 7 8 for(int i=1, j=0; ;){ 9 if(stack.empty()) return true; 10 if(!stack.empty() && stack.peek()!=popA[j]){ // unboxing 11 if(i==pushA.length) break; 12 stack.push(pushA[i]); 13 i++; 14 } else if(!stack.empty() && stack.peek()==popA[j]) { 15 stack.pop(); 16 j++; 17 } 18 } 19 20 return false; 21 }