给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。
首先可以确定的是,这道题涉及到队列(FIFO)和栈(FILO),JavaScript数组都可以模拟这两种数据类型。
解题思路:
- 将
pushed的元素shift出来,将出列的元素推入一个新数组中(pushedArray,pushedArray模拟栈行为) - 比较
pushedArray的栈顶与popped队列的队首是否相同- 相同的话,将
pushedArray栈顶元素出栈,popped队首元素出列,继续比较栈顶和队首是否相同 - 不同的话,继续将
pushed的元素出列(shift操作)
- 相同的话,将
- 直到循环结束:如果
popped的长度为0时,表明他们是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果,返回true,否则就返回false
function validateStackSequences(pushed: number[], popped: number[]): boolean {
const pushedArray = []
let k = pushed.length
while (k--) {
const cur = pushed.shift()
pushedArray.push(cur)
while (
pushedArray.length > 0 &&
pushedArray[pushedArray.length - 1] === popped[0]
) {
popped.shift()
pushedArray.pop()
}
}
return popped.length === 0
}
- 时间复杂度:O(n),n为队列长度
- 空间复杂度:O(n)