正题
验证栈序列
给定 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 之前弹出。
解析:
依照题意,我们必须实现 poped 顺序,但前提是必须按照 push的元素顺序来。也就是说我们可以设置一个栈,依次遍历 pushed,并且 push进去,当遇到 poped 第一个元素时,即将 stack弹出,再继续遇到 poped的第二个元素,以此类推,如果最后 poped 都能被执行,那么就表示是 ok 的。
解释不够详尽,那么直接看图。
完整代码:
/**
* @param {number[]} pushed
* @param {number[]} popped
* @return {boolean}
*/
var validateStackSequences = function(pushed, popped) {
const stack = []
let popIndex = 0
for(let index = 0 ; index < pushed.length; index++) {
const number = pushed[index]
stack.push(number)
while(popIndex <= popped.length - 1 && popped[popIndex] === stack[stack.length - 1]) {
stack.pop()
popIndex++
}
}
return stack.length === 0
};