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

😀前言

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

🏠个人主页:尘觉主页

文章目录

😀栈的压入、弹出序列

🥰题目链接

牛客网

😊问题描述

给定两个整数序列 pushSequence 和 popSequence,其中 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 为空,说明 popSequence 是 pushSequence 的合法弹出序列,返回 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连支持一下,创造不易您们的支持是我的动力🤞

相关推荐
kaiyou202623 分钟前
用户研究岗秋招,统计分析能力怎么学习和证明?
数据库·python·学习
知识分享小能手25 分钟前
C++ 学习教程,从入门到精通,string类和标准模板库 — 完整知识点详解(16)
开发语言·c++·学习
听风若依1 小时前
数据在内存中的存储-纸面笔记整理
c语言·笔记
xiaominngtongxue1 小时前
从中职技能节看实训教学的组织逻辑
笔记
朝朝辞暮i1 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
杨逢昌工厂6S管理1 小时前
109-杨逢昌车间管理负熵循环:三环体系持续输出负熵的机制解析
经验分享·笔记·职场和发展·学习方法
inferno1 小时前
SVN学习笔记(二)
笔记·学习·svn
Evand J2 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
传奇开心果编程2 小时前
【ArkUI进阶练中学】第12课:应用架构演进与遗留系统迁移
学习·ui·华为·harmonyos
我想我不够好。2 小时前
装一个纯净的系统
学习