LeetCode刷题,验证栈序列(946)

364 阅读1分钟

验证栈序列

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

解题代码

思路:因为弹出元素的序列中的每一位只能是压入序列中的头元素,或者是未来入栈的元素。 所以我们可以遍历每个出栈元素,对比入栈元素中是否有相同的值且顺序合法。

var validateStackSequences = function(pushed, popped) {
  const pushedStack = []; // 存储压入元素的新栈
  for (let i = 0, j = 0; i < popped.length; i++) {
    const popTop = popped[i]; // 获取出栈的元素
    // 如果当前出栈的元素不等于新栈中的头元素,说明此时这个序列依然是非法的
    while (j < pushed.length && popTop !== pushedStack[pushedStack.length - 1]) {
      pushedStack.push(pushed[j]) // 将原入栈序列依次遍历,入栈到新栈里面
      j += 1; // 栈往后走一位,继续入栈下一位元素
    }
    if (popTop !== pushedStack[pushedStack.length - 1]) return false; // 此时如果依然不相等那么说明入栈序列遍历完了,依然不等于出栈序列的头元素,即非法。
    pushedStack.pop(); // 到这里说明已经找到了,那么新栈出队,继续找下面的元素是否合法
  }
  return true; // 入出栈序列遍历完,且入栈序列能依次正确入栈,返回true即可。
};