import java.util.Stack;
/**
* 栈的压入、弹出序列
* 描述:输入两个序列,表示输入和弹出顺序,判断第二个是否是该栈第一个的弹出顺序
方法:需要一个辅助栈
* @author lenovo047
*
*/
public class test22 {
public boolean IsPopOrder(int [] pushA,int [] popA) {
boolean flag = false;
//都是一个元素的时候直接判断
if(pushA.length == 1 && popA.length == 1 && popA[0] == pushA[0]){
return true;
}
if(pushA.length == 1 && popA.length == 1 && popA[0] != pushA[0]){
return false;
}
if(popA != null && pushA != null){ //两个序列都为空,直接返回
Stack<Integer> stack = new Stack<>();
int i = 0; //push的指针
int j = 0; //pop的指针
//检查每个出栈
while(j < popA.length){
//push中的数是否村入栈
while(i < pushA.length && pushA[i] != popA[j]){
stack.push(pushA[i]);
i++;
}
//相等的元素直接就过去了
++i;
++j;
//定义接下来要出栈元素
int top = 0;
//如果要出栈的元素和pop相等,就一直出
while(!stack.isEmpty() && (top = stack.pop()) == popA[j]){
++j;
}
//如果不等了,还放回去
if(j < popA.length){
stack.push(top);
}
//当找不到合适出栈元素时,push已经放完了,stack因为不相等也弹不出来,就结束
if(i >= pushA.length && !stack.isEmpty()){
break;
}
}
if(stack.isEmpty()){
flag = true;
}
}
return flag;
}
}