25-leetCode: 946. 验证栈序列

165 阅读1分钟

题目

给定 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

解题思路

因为栈的特性是先进后出,所以定义一个用来暂存的栈temp,和指向poped数组的指针p,用来接收pushed的值,每次push进来的值都进行循环判断,是否与poped[p]是否相等,满足条件p向后移一位,表示之前的值被匹配上,同时将temp最后一位出栈,最后返回temp长度,如果为空,表示是正常的栈序列

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function(pushed, popped) {
    // 定义暂存栈和指针
    let temp = [], p = 0;
    // 将pushed数组的值依次放入temp中
    pushed.forEach(item => {
        temp.push(item);
        // 判断temp栈顶元素是否与poped[p]值相等,相等表示可以出栈
        while(temp.length && temp[temp.length - 1] === popped[p]) {
            temp.pop();
            p++;
        }
    })

    // 最后如果temp中有值,表示不能完全出栈,没值才是标准的栈
    return temp.length === 0;
};