[路飞]_LeetCode题946验证栈序列

198 阅读2分钟

题目描述

给定 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 <= 1000 0 <= pushed[i] <= 1000 pushed 的所有元素 互不相同 popped.length == pushed.length popped 是 pushed 的一个排列

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

  1. 定义一个空序列resStack,按照pushed数组的顺序依此向空序列里推入pushed的数据。
  2. 每推入一次就去popped中找第一个元素检查,如果popped第一个元素等于resStack的栈顶元素,那么就对。resStack序列做pop操作,此时将popped中已经被resStack序列pop过的首元素移除,使用shift。
  3. 直到第二步popped数组的首元素不等于resStack中的栈顶元素,pushed向下循环一位。
  4. 当pushed循环完成后,如果resStack中为空说明给定的pushed和popped是可以按照一定的顺序完成从一个空序列走完全部的pushed和popped的操作。

题解代码

 * @lc app=leetcode.cn id=946 lang=javascript
 *
 * [946] 验证栈序列
 */

// @lc code=start
/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function(pushed, popped) {
  let resStack = [];//定义空栈
  for (let i = 0; i < pushed.length; i++) {
    resStack.push(pushed[i]);//按照pushed的顺序向resStack中添加

    //然后去popped中找首元素,如果首元素等于resStack栈顶元素,就将resStack做pop操作
    //直到不能pop,继续循环,推入下一元素
    while (popped[0] !== undefined && popped[0] === resStack[resStack.length - 1]) {
      resStack.pop();
      popped.shift();
    }
  }
  return !resStack.length;
};
// @lc code=end