题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
解题思路:判断一个序列是不是栈的弹出顺序的规律:如果下一个弹出的数字刚好是栈顶数字,那么直接弹出。如果下一个弹出的数字不在栈顶,我们把压栈序列中还没有入栈的数字压入辅助栈,知道把下一个需要弹出的数字压入栈顶为止。如果所有的数字都压入栈了仍没有找到下一个弹出的数字,那么该序列不可能是一个弹出序列。
具体代码如下:
public boolean isPopOrder(int[] pushArr,int[] popArr){
if(pushArr.length==0||popArr.length==0)
return false;
//借用一个辅助栈 遍历入栈数组,一个个入栈
//每次入栈,都需要检查:如果发现栈顶数字是弹出数组中的数字 那么直接弹出,并且弹出数组位置下移一位
//循环完毕,如果栈内还有数字,则序列不对
Stack<Integer> s=new Stack<>();
//标识弹出序列位置
int popIndex=0;
for(int i=0;i<pushArr.length;i++){
s.push(pushArr[i]);
while(!s.isEmpty()&&s.peek()==popArr[popIndex]){
//出栈
s.pop();
//弹出序列后移一位
popIndex++;
}
}
return s.empty();
}
测试代码和结果:
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr1={1,2,3,4,5};
int[] arr2={4,5,3,2,1};
int [] arr3={4,3,5,1,2};
Problem31 p=new Problem31();
System.out.println(p.isPopOrder(arr1, arr2));
System.out.println(p.isPopOrder(arr1, arr3));
}
true
false