题目介绍
给定 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 之前弹出。
提示:
1 <= pushed.length <= 10000 <= pushed[i] <= 1000pushed的所有元素 互不相同popped.length == pushed.lengthpopped是pushed的一个排列 leetcode-946 验证栈序列
b站视频
解题思路
此题要验证 pushed 数组的入栈顺序能不能用 popped 数组所示的顺序弹出,栈的规则是先进后出,所以每次弹出的值必然是当前入栈的最后一个元素,所以我们只需要在每入栈一个元素之后,判断该元素是否是 popped 数组的第一个元素就行
- 创建一个空栈 stack
- 按 pushed 数组的顺序往 stack 里面入栈
- 每入栈一个元素,判断该元素是否是 popped 数组的第一个元素,如果是,则从 stack 出栈一个元素,popped 数组弹出第一个元素,继续比较 stack 的栈顶元素和 popped 的第一个元素
- 判断 stack 栈是否为空,如果是,说明 pushed 的顺序能够完全按 popped 的顺序弹出,反之亦然
解题代码
var validateStackSequences = function(pushed, popped) {
const stack = []
for (let i = 0; i < pushed.length; i++) {
stack.push(pushed[i])
while (popped.length && popped[0] === stack[stack.length - 1]) {
popped.shift()
stack.pop()
}
}
return !stack.length
};