题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。
示例:
压栈序列:1、2、3、4、5
序列4、5、3、2、1是一个弹出序列
序列4、3、5、1、2不是一个弹出序列
答案:
借助辅助栈
将压栈数组先入辅助栈,每次入栈后均去判断是否是弹出序列要弹出的元素
若是,则从辅助栈中弹出元素,然后继续判断下一个元素能否弹出;
若不是则继续将压栈数组元素入辅助栈。
若最终辅助栈为空,则说明所有元素均按照弹出序列弹出
若辅助栈不为空,则说明不是弹出序列。
public boolean isPopOrder(int[] pushArr, int[] popArray) {
if (pushArr == null || pushArr.length == 0 || popArray == null ||
popArray.length == 0) {
throw new RuntimeException("非法输入!");
}
Stack<Integer> stack = new Stack<>();
int j = 0;
for (int i = 0; i < pushArr.length; i++) {
stack.push(pushArr[i]);
while (j < popArray.length && stack.peek() == popArray[j]) {
stack.pop();
j++;
}
}
return stack.isEmpty();
}