当前位置: 首页 > news >正文

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

img

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

🏠个人主页:尘觉主页

文章目录

  • 😀栈的压入、弹出序列
    • 🥰题目链接
    • 😊问题描述
      • ❤️‍🔥解决思路
      • 🤔代码实现
      • 💞示例分析
    • 😄总结

😀栈的压入、弹出序列

🥰题目链接

牛客网

😊问题描述

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

示例分析:

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

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

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 代码实现:

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 用于遍历 popSequencefor (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连支持一下,创造不易您们的支持是我的动力🤞

img

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【人工智能】对智元机器人发布的远征A1所应用的AI前沿技术进行详细分析,基于此整理一份学习教程。
  • 每天一个数据分析题(四百九十)- 主成分分析与因子分析
  • 基于SpringBoot的Java个人博客系统的设计与实现(源码+lw+部署文档+讲解等)
  • 【论文阅读】APMSA: Adversarial Perturbation Against Model Stealing Attacks(2023)
  • Few-shot Learning
  • Python.NET:打开Python与.NET世界互通的大门
  • 代码与优化(4)——MYSQL的连表与子查询
  • 算法日记day 43(动归之不同的子序列|两个字符串的删除操作)
  • 一文学会用 Maven
  • java JVM ZGC垃圾收集器关键特性和工作原理
  • 奇异递归Template有啥奇的?
  • Linux CentOS java JDK17
  • Python数据分析:Pandas与NumPy结合,实现高效数值计算,提升数据分析效率的最佳实践
  • Ubuntu10.04安装skyeye1.3.2问题
  • 如何使⽤组将⼀个文件拆分成多个文件 (LINQ)(C#)
  • [Vue CLI 3] 配置解析之 css.extract
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Docker入门(二) - Dockerfile
  • Java IO学习笔记一
  • python大佬养成计划----difflib模块
  • Vue2.x学习三:事件处理生命周期钩子
  • win10下安装mysql5.7
  • 聊聊hikari连接池的leakDetectionThreshold
  • 扑朔迷离的属性和特性【彻底弄清】
  • 浅谈Golang中select的用法
  • 为什么要用IPython/Jupyter?
  • 积累各种好的链接
  • ​linux启动进程的方式
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #职场发展#其他
  • (2)Java 简介
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (回溯) LeetCode 78. 子集
  • (五)Python 垃圾回收机制
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)Android学习系列(31)--App自动化之使用Ant编译项目多渠道打包
  • (转)scrum常见工具列表
  • .“空心村”成因分析及解决对策122344
  • .axf 转化 .bin文件 的方法
  • .DFS.
  • .NET Project Open Day(2011.11.13)
  • .NET Remoting学习笔记(三)信道
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .Net 垃圾回收机制原理(二)
  • .Net接口调试与案例
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET项目中存在多个web.config文件时的加载顺序
  • .net与java建立WebService再互相调用
  • .NET中GET与SET的用法
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @Autowired多个相同类型bean装配问题
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400