题目描述(引自剑指offer)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列{1,2,3,4,5}是某栈的压入顺序,序列{4,5,3,2,1}是该压栈序列对应的一个弹出序列,但{4,3,5,1,2}就不可能是该压栈序列的弹出序列。
菜鸡与大佬的对话
题目分析
经过与大佬的一番对话,菜鸡已经掌握了栈这种数据结构。菜鸡向题目发出了挑战。经过对题目的一番分析,菜鸡发现,两个序列的长度相等是符合要求的前提。特别的,两个序列均为空(null)或者两个序列的长度为0,均可看作两个序列的长度相等。在此基础上,菜鸡认为,只要申请一个辅助栈,根据压栈序列和弹出序列中的元素模拟压栈和弹出过程,最后判断栈中是否仍有元素存在,即可得到答案。思考过后,菜鸡决定用Java代码把自己的心路历程描绘出来。
代码实现
import java.util.Stack;
public class Solution {
public boolean isPopOrder(int[] pushArray, int[] popArray) {
int pushLength = getLength(pushArray);
int popLength = getLength(popArray);
if (pushLength != popLength) {
return false;
}
Stack<Integer> stack = new Stack<>();
int flag = 0;
for (int i = 0; i < pushLength; i++) {
stack.push(pushArray[i]);
while (!stack.isEmpty() && stack.peek() == popArray[flag]) {
stack.pop();
flag++;
}
}
return stack.isEmpty();
}
private int getLength(int[] array) {
return array == null ? -1 : array.length;
}
}
经过本次修炼,菜鸡掌握了栈的数据结构,并成功解答了题目。菜鸡收拾好行囊,准备向下一站进发……