这里借助了辅助栈,将元素入栈,然后当碰到栈顶元素与poped数组中的元素相同,就把这个数pop出来,有个计数器计算栈顶元素与poped的元素相同的个数,如果个数等于pushed的长度,就返回true,否则返回fasle。
class Solution {
public boolean validateStackSequences(int[] pushed, int[] popped) {
int N = pushed.length;
Stack<Integer> stack = new Stack();
int j = 0;
for (int x: pushed) {
stack.push(x);
while (!stack.isEmpty() && j < N && stack.peek() == popped[j]) {
stack.pop();
j++;
}
}
return j == N;
}
}
下面借助示例1,模拟一下整个过程。pushed=1,2,3,4,5 poped=4,5,3,2,1
依次遍历pushed元素,入栈都是依次入的,所以就先将元素1入栈,发现1与poped的首元素4不同,则说明他没有出栈;到2,2入栈,2与4不同,2不需要出栈;继续到3,3入栈,3与4不同,不出栈;到4,4与4相同,所以4出栈,计数器j++,再重新到while循环,发现现在的peek是3,而j指向的元素是5,所以不进入while循环,走外面的for循环;这时候到5,5先入栈,栈顶元素是5,5与poped[j]相同,所以5出栈,计数器j++;然后继续while循环,栈顶元素为3,3与poped[j]相同,所以继续出栈,j++,后面依次,直到栈空。最后j就是记录pop了几次,如果元素pop完了,j就与pushed的长度相等,就说明这个序列是栈序列。