[路飞]_leetcode刷题_946. 验证栈序列

158 阅读3分钟

题目

946. 验证栈序列

给定 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 之前弹出。  

思路:

这一题,首先要明白题目的意思是什么。实不相瞒,我看题目看了十几分钟不知道再表达啥。。。

然后在题解中看懂了题目的意思,哈哈。

题目大意用大白话将就是:

有这么一个空栈,我对这个栈进行一系列压入和弹出后,判断它最终还是不是一个空栈。
压入顺序按pushed数组来,弹出顺序按popped数组来。
那么我们每压入一个数,都要判断,按弹出顺序popped来看,待弹出的数在不在栈顶,在的话就要弹出。

我举几个例子大家就明白了。

一.设pushed为[1,2,3],设popped为[3,2,1]

  1. 先压入1得stack = [1],popped带弹出数为3,无法弹出,stack = [1]

  2. 再压入2得stack = [1,2],popped待弹出数为3,无法弹出,stack = [1,2]

  3. 再压入3得stack = [1,2,3],popped待弹出数为3,弹出3stack = [1,2]

  4. 数压完了,继续看是否能弹出,popped待弹出数为2,弹出2stack=[1]

  5. popped待弹出数为1,弹出1stack=[]

  6. 结束,stack = [] ,那么结果为true

二.设pushed为[1,3,2],popped为[3,2,1]

  1. 先压入1得stack = [1],popped带弹出数为3,无法弹出,stack = [1]

  2. 再压入3得stack = [1,3],popped待弹出数为3,弹出3stack = [1]

  3. 再压入2得stack = [1,2],popped待弹出数为2,弹出2stack = [1]

  4. 数压完了,继续看是否能弹出,popped待弹出数为1,弹出1stack=[]

  5. 结束,stack = [] ,那么结果为true

二.设pushed为[1,2,3],popped为[3,1,2]

  1. 先压入1得tack = [1],popped带弹出数为3,无法弹出,stack = [1]

  2. 再压入2得stack = [1,2],popped待弹出数为3,无法弹出,stack = [1,2]

  3. 再压入3得stack = [1,2,3],popped待弹出数为3,弹出3stack = [1,2]

  4. 数压完了,继续看是否能弹出,popped待弹出数为1,无法弹出,stack=[1,2]

  5. 结束,stack = [1,2] ,那么结果为false

那么我们实际操作,可以用栈+指针的方法,用栈来记录存在的数,指针去记录现在该弹出的数再popped中的下标

上代码:

/**
 * @param {number[]} pushed
 * @param {number[]} popped
 * @return {boolean}
 */
var validateStackSequences = function(pushed, popped) {
    let popIndex = 0;
    let stack = [];
    for(let i=0;i<pushed.length;i++){
        stack.push(pushed[i]);
        while(popped[popIndex] !=undefined && stack[stack.length-1] == popped[popIndex]){
            popIndex++;
            stack.pop()
        }
    }
    return stack.length==0
};