一日一练:验证栈序列

79 阅读1分钟

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

首先可以确定的是,这道题涉及到队列(FIFO)和栈(FILO)JavaScript数组都可以模拟这两种数据类型。

解题思路:

  1. pushed的元素shift出来,将出列的元素推入一个新数组中(pushedArraypushedArray模拟栈行为)
  2. 比较pushedArray的栈顶与popped队列的队首是否相同
    • 相同的话,将pushedArray栈顶元素出栈,popped队首元素出列,继续比较栈顶和队首是否相同
    • 不同的话,继续将pushed的元素出列(shift操作)
  3. 直到循环结束:如果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)