##题目描述
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列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(); //如果全部正常弹出,则为真,按照该序列,栈并没有弹出到空为止则不是
}
}