面试题31:栈的压入、弹出序列
题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。
问题分析
这里要利用栈先进先出的特点,所以我们干脆建立一个栈(当然你用数组也是OK的),按照压栈序列依次进行入栈操作,按出栈序列的顺序依次弹出数字。
我们直接使用上面题目描述举的例子
序列1、2、3、4、5是某栈的压栈序列
序列4、5、3、2、1是该压栈序列对应的一个弹出序列
我们在元素压栈期间,随时有元素出栈。这个时候在出栈时,若下一个要出栈的数字与栈顶数字相同则弹出,否则则入栈。
当到元素4的时候,需要出栈。
然后到元素5压栈,接着继续判断是否出栈,依次进行下去,如果最后栈为空,说明所有元素出栈成功,代表两个序列匹配。
如果压栈序列中的所有数字都入栈后没有完全出栈成功则代表两个序列不匹配,返回false。
三、问题解答
public boolean isPopOrder(int [] pushA,int [] popA) {
if(pushA==null || popA==null) {
return false;
}
Stack<Integer> stack = new Stack<Integer>();
//提前判断长度是否相等
if(popA.length != pushA.length || pushA.length==0) {
return false;
}
int popIndex=0;
for(int pushIndex = 0; pushIndex < pushA.length; pushIndex++) {
stack.push(pushA[pushIndex]);
while(!stack.empty() && stack.peek()==popA[popIndex]) {
stack.pop();
popIndex++;
}
}
return stack.empty();
}