##题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
##解题思路
1,按照顺序持续入栈,直到发现和出栈第一个元素相同的为止,弹出,接着判断
2,这时候就有两种情况,第一种就是//1,2,3,4,5和3,2,1,4,5这种情况弹完3,弹之前的 ,然后之后的入栈再弹。第二种情况是 //1,2,3,4,5和3,4,5,1,2这种情况,弹完3,入栈之后的,弹出,再弹之前的。总结起来就是逐个比较即可,当前没有接着入栈,如果到最后栈还没弹完,说明该弹出序列不是该压入序列的正确弹出。
##代码实现
/** * */ package 栈和队列; import java.util.Stack; /** * <p> * Title:IsPopOrder * </p> * <p> * Description: * </p> * * @author 田茂林 * @data 2017年8月22日 上午11:03:06 */ public class IsPopOrder { Stack<Integer> stack = new Stack<Integer>(); public boolean isPopOrder(int[] pushA, int[] popA) { if (pushA == null || popA == null || pushA.length < 1 || popA.length < 1) { return false;// 非空判断 } int index = 0; for (int i = 0; i < pushA.length; i++) { stack.push(pushA[i]); //1,2,3,4,5和3,4,5,1,2这种情况 while(!stack.isEmpty()&& stack.peek() == popA[index]) { //1,2,3,4,5和3,2,1,4,5这种情况 stack.pop(); index++; } } return stack.isEmpty(); //如果全部正常弹出,则为真,按照该序列,栈并没有弹出到空为止则不是 } }