题目
946. 验证栈序列
给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
示例 1:
输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1] 输出:true 解释:我们可以按以下顺序执行: push(1), push(2), push(3), push(4), pop() -> 4, push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1 示例 2:
输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2] 输出:false 解释:1 不能在 2 之前弹出。
思路:
这一题,首先要明白题目的意思是什么。实不相瞒,我看题目看了十几分钟不知道再表达啥。。。
然后在题解中看懂了题目的意思,哈哈。
题目大意用大白话将就是:
有这么一个空栈,我对这个栈进行一系列压入和弹出后,判断它最终还是不是一个空栈。
压入顺序按pushed数组来,弹出顺序按popped数组来。
那么我们每压入一个数,都要判断,按弹出顺序popped来看,待弹出的数在不在栈顶,在的话就要弹出。
我举几个例子大家就明白了。
一.设pushed为[1,2,3],设popped为[3,2,1]
-
先压入1得
stack = [1],popped带弹出数为3,无法弹出,stack = [1] -
再压入2得
stack = [1,2],popped待弹出数为3,无法弹出,stack = [1,2] -
再压入3得
stack = [1,2,3],popped待弹出数为3,弹出3,stack = [1,2] -
数压完了,继续看是否能弹出,popped待弹出数为
2,弹出2,stack=[1] -
popped待弹出数为
1,弹出1,stack=[] -
结束,
stack = [],那么结果为true
二.设pushed为[1,3,2],popped为[3,2,1]
-
先压入1得
stack = [1],popped带弹出数为3,无法弹出,stack = [1] -
再压入3得
stack = [1,3],popped待弹出数为3,弹出3,stack = [1] -
再压入2得
stack = [1,2],popped待弹出数为2,弹出2,stack = [1] -
数压完了,继续看是否能弹出,popped待弹出数为
1,弹出1,stack=[] -
结束,
stack = [],那么结果为true
二.设pushed为[1,2,3],popped为[3,1,2]
-
先压入1得
tack = [1],popped带弹出数为3,无法弹出,stack = [1] -
再压入2得
stack = [1,2],popped待弹出数为3,无法弹出,stack = [1,2] -
再压入3得
stack = [1,2,3],popped待弹出数为3,弹出3,stack = [1,2] -
数压完了,继续看是否能弹出,popped待弹出数为
1,无法弹出,stack=[1,2] -
结束,
stack = [1,2],那么结果为false
那么我们实际操作,可以用栈+指针的方法,用栈来记录存在的数,指针去记录现在该弹出的数再popped中的下标
上代码:
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function(pushed, popped) {
let popIndex = 0;
let stack = [];
for(let i=0;i<pushed.length;i++){
stack.push(pushed[i]);
while(popped[popIndex] !=undefined && stack[stack.length-1] == popped[popIndex]){
popIndex++;
stack.pop()
}
}
return stack.length==0
};