题目:
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)
思路:
新建一个栈,根据入栈顺序依次入栈,每入一个和出栈顺序比较,应该出栈就出栈,不应该出栈就继续进栈,最后栈空且入栈出栈数组都走到了结尾,返回true
步骤:
先将第一个元素入栈,将栈顶元素和popA[j]比较,
若相等,且栈不空,则栈顶元素出栈,j++;
若不相等,且入栈数组没有走到头(i<pushA.length),则pushA[i]入栈
可以入栈和出栈只有这两种情况,其他情况break;
最后判断栈是否为空,空返回true, 不空返回false
代码:
import java.util.ArrayList;
import java.util.Stack;
public class Solution {
public boolean IsPopOrder(int [] pushA,int [] popA) {
Stack<Integer> stack = new Stack<Integer>();
stack.push(pushA[0]);//第一个元素先入栈
int i = 1;//遍历pushA,入栈序列
int j = 0;//遍历popA,出栈序列
while (j < popA.length) {
if ((stack.empty() != true) && (stack.peek() == popA[j])) {
//栈顶元素等于当前popA[j],将栈顶元素出栈
stack.pop();
j++;
} else if ((stack.peek() != popA[j]) && i < pushA.length) {//若栈顶元素不等于popA[j]且i小于pushA的长度,则pushA[i]继续入栈
stack.push(pushA[i]); //应注意&&后面的条件,开始没通过就是因为没有考虑到“pushA已经走到头了,不能再入栈"的情况
i++;
} else {
break;
}
}
if (stack.empty()) {
return true;
} else {
return false;
}
}
}