算法的学习笔记—栈的压入、弹出序列(牛客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连支持一下,创造不易您们的支持是我的动力🤞

相关推荐
无限码力11 分钟前
路灯照明问题
数据结构·算法·华为od·职场和发展·华为ode卷
嘻嘻哈哈樱桃11 分钟前
前k个高频元素力扣--347
数据结构·算法·leetcode
dorabighead12 分钟前
小哆啦解题记:加油站的奇幻冒险
数据结构·算法
Ritsu栗子28 分钟前
代码随想录算法训练营day35
c++·算法
好一点,更好一点38 分钟前
systemC示例
开发语言·c++·算法
五味香1 小时前
Java学习,查找List最大最小值
android·java·开发语言·python·学习·golang·kotlin
卷卷的小趴菜学编程1 小时前
c++之List容器的模拟实现
服务器·c语言·开发语言·数据结构·c++·算法·list
小爬菜1 小时前
Django学习笔记(启动项目)-03
前端·笔记·python·学习·django
小爬菜1 小时前
Django学习笔记(bootstrap的运用)-04
笔记·学习·django
林开落L1 小时前
模拟算法习题篇
算法