前端算法小白攻略20-leetcode(验证栈序列)

117 阅读2分钟

「这是我参与2022首次更文挑战的第5天,活动详情查看:2022首次更文挑战

前言

今天这道题,着实令人迷糊,验证栈序列,需要多琢磨一下,不知道在看的各位感觉怎么样,废话不多说,直接进入正题。

题目描述

946. 验证栈序列

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

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

题目解析

  1. 首先分析下题目后半段,‘只有当它们可能是在最初空栈上进行的push和pop操作序列的结果时’,这句话表明,题目前部分给定的两个栈序列,如果能在一个空栈上经过push和pop操作得来,那么就返回true,否则就是false;

  2. 那么我们就先初始化一个空栈,按题目要求,在栈中push的值为归为push序列的值,执行pop操作返回的值就归到pop序列中,只要最后能得到跟题目指定的两个序列,并且栈为空,那么就说明我们本题验证栈序列的结果为true;

  3. 既然我们要同时得到两个序列,那我们先假设push序列是ok的,这样我们就可以依照这个序列进行操作,看能否在空栈中执行push操作的时候,得到pop序列中需要的值

  4. 我们遍历pushed栈序列往空栈中push值,如果空栈栈顶元素和poped栈第一项相等,那么空栈执行栈顶出栈,poped第一项出栈,直至poped为空,如果pushed序列遍历完之后,空栈为空,poped栈为空,说明我们验证栈序列成功

开始解题

var validateStackSequences = function(pushed, popped) {
    let empty = [];   // 初始化一个空栈
    while(pushed.length) { // 遍历pushed栈
        empty.push(pushed[0]); // 每次往空栈里入栈pushed的第一项
        while(empty[empty.length-1] === popped[0]){  // 判断empty栈顶元素与popped头部元素是否相等
            empty.pop();
            popped.shift();
            if(!popped.length) break; // popped栈为空说明,popped序列验证成功
        }
        pushed.shift(); 
    }
    return empty.length === 0 && popped.length === 0; // empty与popped均为空才说明验证栈序列陈宫
};