题目
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出序列。
思路
- 注意压入栈的元素可以随时弹出,因此弹出序列有多种;
- 创建一个辅助栈,按照压入序列向栈中压入元素;
- 每当压入一个元素时,如果这个元素刚好是弹出序列元素,那么直接弹出;如果不是,则把压栈序列中还没有入栈的数字压入辅助栈,直到栈顶元素为相应弹出序列元素;如果所有元素都压入栈而和按照弹出顺序的元素都不相等,说明该弹出序列不是该栈的弹出顺序。
- 初始条件:先往辅助栈stack中压入一个元素,初始化pushIndex为1,popIndex为0;
- 终止条件:当array2是array1的出栈顺序时,正常经过循环退出,此时array1和array2都遍历了一遍,pushIndex=popIndex=array.length;当array2不是array1的出栈顺序,此时array1的所有元素都压入stack,均不等于array[popIndex];
- 循环过程:比较栈顶元素和array2[popIndex],不相等则继续往里面压入元素,直到栈顶元素和array2[popIndex]相等或者已经将所有的元素压入stack,检查如果此时压入所有元素仍然不相等,返回false;正常情况下,此时栈顶元素和array2[popIndex]相等,将其弹出,并popIndex++,进行下一组循环。当整个循环正常结束,即pushIndex=popIndex=array.length时,返回true。
- 边界条件:
输入的数组为null或者元素为0,或者两数组唱的不相等。
public class Q22IsPopOrder {
public static boolean isPopOrder(int[] array1,int[] array2){
if (array1==null||array1.length==0||array2==null||array2.length==0||array1.length!=array2.length)
return false;
Stack stack=new Stack();
stack.push(array1[0]);
int pushIndex=1;
int popIndex=0;
while (pushIndex<array1.length||popIndex<array2.length){
while (stack.getTop()!=array2[popIndex]&&pushIndex<array1.length){
stack.push(array1[pushIndex++]);
}
if (pushIndex==array1.length&&stack.getTop()!=array2[popIndex]) {
return false;
}
stack.pop();
popIndex++;
}
return true;
}
public static void main(String[] args) {
int[] array1={1,2,3,4,5};
int[] array2={4,5,3,2,1};
int[] array3={4,3,5,1,2};
System.out.println(isPopOrder(array1,array2));
System.out.println(isPopOrder(array1,array3));
}
}