算法的学习笔记—栈的压入、弹出序列(牛客JZ31)

😀前言

栈(Stack)是一种常见的数据结构,具有"后进先出"的特性。在实际应用中,我们常常需要验证一组操作是否符合栈的特性。本文将探讨如何通过编程判断一个给定的弹出序列是否可以由另一个给定的压入序列生成,并提供一个高效的解决方案。

🏠个人主页:尘觉主页

文章目录

😀栈的压入、弹出序列

🥰题目链接

牛客网

😊问题描述

给定两个整数序列 pushSequencepopSequence,其中 pushSequence 表示一个栈的压入顺序,popSequence 表示一个弹出顺序。我们需要判断 popSequence 是否可能是 pushSequence 的一个合法弹出序列。

示例分析:

  • 输入:pushSequence = [1,2,3,4,5]popSequence = [4,5,3,2,1]
  • 输出:true

说明:可以通过如下操作序列得到 popSequence

scss 复制代码
push(1)=>push(2)=>push(3)=>push(4)=>pop()=>push(5)=>pop()=>pop()=>pop()=>pop()
这样的顺序得到[4,5,3,2,1]这个序列,返回true     
  • 输入:pushSequence = [1,2,3,4,5]popSequence = [4,3,5,1,2]
  • 输出:false

说明:由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false

❤️‍🔥解决思路

要判断 popSequence 是否是 pushSequence 的合法弹出序列,我们可以利用栈的特性进行模拟。具体步骤如下:

  1. 使用辅助栈 :我们利用一个辅助栈 stack 来模拟栈的压入和弹出操作。
  2. 逐步压入和匹配
    • 遍历 pushSequence,将元素逐个压入 stack 中。
    • 每次压入元素后,检查 stack 的栈顶元素是否与 popSequence 的当前元素相同。如果相同,则执行弹出操作,并将 popSequence 指针向后移动。
    • 继续此过程,直到 pushSequence 遍历完毕。
  3. 结果判定
    • 如果最终 stack 为空,说明 popSequencepushSequence 的合法弹出序列,返回 true
    • 否则,返回 false

🤔代码实现

以下是上述思路的 Java 代码实现:

java 复制代码
import java.util.Stack;

public class StackOrder {
    public boolean IsPopOrder(int[] pushSequence, int[] popSequence) {
        int n = pushSequence.length;
        Stack<Integer> stack = new Stack<>();
        
        // pushIndex 用于遍历 pushSequence
        // popIndex 用于遍历 popSequence
        for (int pushIndex = 0, popIndex = 0; pushIndex < n; pushIndex++) {
            // 将元素压入栈中
            stack.push(pushSequence[pushIndex]);
            
            // 如果栈顶元素等于当前弹出序列的元素,则执行出栈操作
            while (popIndex < n && !stack.isEmpty() && stack.peek() == popSequence[popIndex]) {
                stack.pop();
                popIndex++;
            }
        }
        
        // 如果栈为空,说明弹出序列合法
        return stack.isEmpty();
    }
}

💞示例分析

假设我们使用 pushSequence = [1,2,3,4,5]popSequence = [4,5,3,2,1] 作为输入,按照代码逻辑执行:

  1. 首先压入 1, 2, 3, 4 到栈中。
  2. 栈顶元素为 4,与 popSequence 的第一个元素匹配,执行出栈操作。
  3. 压入 5,然后继续弹出栈顶元素 5,与 popSequence 的第二个元素匹配。
  4. 依次弹出 3, 2, 1,最终栈为空,popSequence 是合法的弹出序列。

😄总结

本文介绍了如何通过使用辅助栈来判断一个弹出序列是否是另一个压入序列的合法序列。该算法的时间复杂度为 O(n),其中 n 是序列的长度,空间复杂度为 O(n)。这种方法不仅直观,而且高效,适用于判断栈操作的合法性。

通过理解这一算法,读者不仅能够解决该问题,还能更好地掌握栈的使用场景与应用技巧。在实际编程中,栈结构广泛应用于表达式求值、函数调用、括号匹配等多种问题,因此,掌握其特性将极大地提高编程能力。

😁热门专栏推荐
想学习vue的可以看看这个

java基础合集

数据库合集

redis合集

nginx合集

linux合集

手写机制

微服务组件

spring_尘觉

springMVC

mybits

等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持

🤔欢迎大家加入我的社区 尘觉社区

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论😁

希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读🍻

如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力🤞

相关推荐
不想当程序猿_6 分钟前
【蓝桥杯每日一题】求和——前缀和
算法·前缀和·蓝桥杯
sanguine__11 分钟前
Web APIs学习 (操作DOM BOM)
学习
落魄君子18 分钟前
GA-BP分类-遗传算法(Genetic Algorithm)和反向传播算法(Backpropagation)
算法·分类·数据挖掘
冷眼看人间恩怨23 分钟前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
菜鸡中的奋斗鸡→挣扎鸡26 分钟前
滑动窗口 + 算法复习
数据结构·算法
Lenyiin35 分钟前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
郭wes代码42 分钟前
Cmd命令大全(万字详细版)
python·算法·小程序
scan7241 小时前
LILAC采样算法
人工智能·算法·机器学习
菌菌的快乐生活1 小时前
理解支持向量机
算法·机器学习·支持向量机
大山同学1 小时前
第三章线性判别函数(二)
线性代数·算法·机器学习