栈的压入、弹出序列

来源:牛客网 《剑指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     }
原文地址:https://www.cnblogs.com/duanguyuan/p/5702110.html