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

举报
尘觉 发表于 2024/08/20 16:18:02 2024/08/20
【摘要】 栈(Stack)是一种常见的数据结构,具有“后进先出”的特性。在实际应用中,我们常常需要验证一组操作是否符合栈的特性。本文将探讨如何通过编程判断一个给定的弹出序列是否可以由另一个给定的压入序列生成,并提供一个高效的解决方案。

😀前言
栈(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 用于遍历 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)。这种方法不仅直观,而且高效,适用于判断栈操作的合法性。

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。