LeetCode破解之栈的压入和弹出序列

175 阅读2分钟

「这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战

题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。

示例 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:模拟

步骤分析:直接模拟,初始化栈s1和一个num=0。每压入一个元素后,我们都判断一下该元素是否和popped中num位置的元素相等,即是否有要出栈的元素,若相等说明可以出栈,则需要循环判断当前元素出栈后的栈顶元素是否和popped中下一位置的元素相等,最后若num和序列长度相同说明每个元素均出栈,不等则说明出栈的元素不够,返回false

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
              Stack<Integer> stack = new Stack<>();
        int i = 0;
        for(int j:pushed){
            stack.push(j);
            //碰到栈顶与弹出数组元素相同时,开始弹出,弹出后,数组指针向后移,继续对比是否相同,如果相同继续弹出,不相同,则将push数组中的元素加入,
            while (i<popped.length&&!stack.isEmpty()&& stack.peek() == popped[i]){
                stack.pop();
                i++;
            }
        }
        return stack.isEmpty();
    }
}

小结:

总体的思路就是建立一个模拟栈,循环操作,判断模拟栈的栈顶元素是否和出栈序列的首元素相同,相同则弹出,不相同,就把入栈序列的元素按顺序压入,然后再判断是否相同,这个循环会在入栈序列为空后终止。当模拟栈不为空时,比较模拟栈和出栈序列首元素,不相同则说明后面的所有序列都无法匹配,返回false 否则,把出栈首元素弹出