[路飞]_算法·每日解读--验证栈序列

203 阅读2分钟

题解946: 验证栈序列

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

示例:

输入: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

题意解读:

  • 根据示例可以更加明确的理解题意,对一个 pushed 序列进行 pushpop 的合适操作,能够得到对应的 poped 序列,即表明能够匹配验证的合理性
  • pushed 首先执行的应当是 push 操作,(条件为非等于 poped 的首个元素)当 push 的当前值和poped的首个元素相等时,则对pushed进行pop操作,将当前push进去的元素pop出来,接着push下一个元素,依次循环判断是否等于poped的下一个元素,同上循环执行即可
  • 最后pushpop的最终结果,pushed序列应当为空,说明序列能够被验证

代码搞起:

var validateStackSequences = function (pushed, popped) {
    //不能直接对pushed序列进行操作=》创建新的数组,用作栈形式进行数据存储
  let stack = [];
  //需要指引,定义即可
  let cur = 0;
  for (let item of pushed) {//array具有iterator迭代器对象可使用for……of进行元素值的遍历
      //循环pushed序列中的每一个值,将其push到stack里
    stack.push(item);
      //进行循环判断,当前push进去的元素是否等于poped的首个元素(需要一个指引 cur)
      //数组首个下标为0开始,所以最后一个也就是push进去的当前项下标应当是length-1
    while (stack.length && stack[stack.length-1] === popped[cur]) {
        //当当前值相等时,将其pop出来
        stack.pop();
        //poped首个元素已经比对过,接下来比对下一个元素,cur++操作
        cur++;
    }
  }
    //如若序列能够通过验证,stack内的元素应当全部被pop出来,length也就等于0
  return !stack.length;
};

①首要重点,能够理清题意,真正明白题之所表达的意图;②参数按需定义,不要提前设想;③下标和长度之间的关系要明晰

👆 👆 以上就是个人对【验证栈序列】的代码解法和方法解读。

所思即所想,思路即套路,一键三连哟!!!