验证栈序列(栈压入、弹出序列),剑指offer,力扣

目录

题目地址:

相同题型:

我们直接看题解吧:

解题方法:

审题目+事例+提示:

解题分析:

解题思路:

代码实现:


题目地址:

946. 验证栈序列 - 力扣(LeetCode)

难度:中等

今天刷验证栈序列(栈压入、弹出序列),大家有兴趣可以点上看看题目要求,试着做一下

相同题型:

建议可以先做做这道题

图书整理II(两个栈实现队列)-CSDN博客

题目:

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。
验证栈序列(栈压入、弹出序列),剑指offer,力扣_第1张图片

我们直接看题解吧:

解题方法:

方法1模拟栈(利用两个序列、数组实现栈)

审题目+事例+提示:

验证栈序列(栈压入、弹出序列),剑指offer,力扣_第2张图片

解题分析:

 因为两个数组是等长的,并且里面的元素都不重复,所以可以用循环进行遍历。

初始化一个栈,将pushed数组中的元素依次加入到栈中,每加入一个元素,就判断栈是否为空 并且 这个元素的值是否与popped数组中的当前元素相等,如果相等则移除栈,如果不相等则继续添加元素。直到遍历完pushed数组,并且比较完popped数组中的元素。

此时如果栈为null,则表示popped数组为pushed数组的弹出序列,返回true,否则返回false
 

解题思路:

验证栈序列(栈压入、弹出序列),剑指offer,力扣_第3张图片

代码实现:

class Solution {
    public boolean validateStackSequences(int[] pushed, int[] popped) {
        Deque stack = new ArrayDeque(); // 创建一个栈对象
        int n = pushed.length; // 获取pushed数组的长度
        for (int i = 0, j = 0; i < n; i++) { // 遍历pushed数组
            stack.push(pushed[i]); // 将pushed数组的元素压入栈中
            // 当栈不为空  且 栈顶元素等于popped数组的当前元素时
           while (!stack.isEmpty() && stack.peek() == popped[j]) { 
                stack.pop(); // 弹出栈顶元素
                j++; // 将j加1,表示已经匹配到了popped数组的下一个元素
            }
        }
        return stack.isEmpty(); // 判断栈是否为空
    }
}

你可能感兴趣的:(#,栈与队列,剑指offer,算法)