跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++Nuct算法

栈的压入弹出序列判断算法详解

栈的压入弹出序列判断问题旨在验证给定弹栈序列是否合法。通过辅助栈模拟压入过程,利用双指针跟踪当前待压入和待弹出元素。当栈顶元素与目标弹出值一致时执行出栈操作。若最终栈为空则序列合法。该算法时间复杂度为 O(n),空间复杂度为 O(n)。适用于处理空序列及单元素等边界情况。

云间漫步发布于 2026/3/28更新于 2026/6/1325 浏览
栈的压入弹出序列判断算法详解

题目描述

给定两个整数序列:

  • pushV:压栈序列
  • popV:待验证的弹栈序列

需要判断 popV 是否可能是 pushV 对应的弹栈序列。

核心思路

要解决这个问题,我们需要理解栈的工作机制:压栈操作:元素按照 pushV 的顺序依次入栈。弹栈操作:在任意时刻,只能弹出栈顶元素。时机选择:可以在压入任意元素后选择弹出栈顶元素。

关键洞察:我们可以通过模拟整个压栈弹栈过程来验证序列的合法性。

完整代码实现

#include <vector>
#include <stack>
using namespace std;

class Solution {
public:
    bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
        // 使用辅助栈模拟压栈弹栈过程
        stack<int> st;
        // 双指针:_push 指向当前要压入的元素,_pop 指向当前要弹出的元素
        size_t _push = 0; // 压栈序列的索引
        size_t _pop = 0;  // 弹栈序列的索引

        // 遍历所有需要压入的元素
        while (_push < pushV.size()) {
            // 将当前元素压入栈中
            st.push(pushV[_push++]);
            // 检查栈顶元素是否与当前期望弹出的元素匹配
            // 如果匹配,则连续弹出所有匹配的元素
            while (!st.empty() && st.top() == popV[_pop]) {
                _pop++; 
                st.(); 
            }
        }
        
         st.();
    }
};
// 移动弹栈序列指针
pop
// 弹出栈顶元素
// 如果所有元素都能正确弹出,栈应该为空
return
empty

算法步骤详解

让我们通过一个具体例子来理解算法的执行过程:

示例输入:

  • pushV = [1, 2, 3, 4, 5]
  • popV = [4, 5, 3, 2, 1]
执行过程模拟

第 1 轮循环: 压入元素 1,栈:[1]。检查栈顶:1 != 4,不匹配。

第 2 轮循环: 压入元素 2,栈:[1, 2]。检查栈顶:2 != 4,不匹配。

第 3 轮循环: 压入元素 3,栈:[1, 2, 3]。检查栈顶:3 != 4,不匹配。

第 4 轮循环: 压入元素 4,栈:[1, 2, 3, 4]。检查栈顶:4 == 4,匹配!弹出 4,栈:[1, 2, 3]。

第 5 轮循环: 压入元素 5,栈:[1, 2, 3, 5]。检查栈顶:5 == 5,匹配!弹出 5,栈:[1, 2, 3]。 继续检查:3 == 3,匹配!弹出 3,栈:[1, 2]。 继续检查:2 == 2,匹配!弹出 2,栈:[1]。 继续检查:1 == 1,匹配!弹出 1,栈:[]。

最终结果:栈为空,返回 true。

算法复杂度分析

时间复杂度

  • 外层循环:执行 n 次(n 为序列长度)
  • 内层循环:虽然是嵌套循环,但每个元素最多被压入和弹出各一次
  • 总时间复杂度:O(n)

空间复杂度

  • 辅助栈空间:最坏情况下需要存储所有 n 个元素
  • 总空间复杂度:O(n)

边界情况处理

空序列处理

如果两个序列长度不同,直接返回 false。空序列的情况,如果两个都为空则返回 true。

单元素序列

测试用例:pushV=[1], popV=[1] -> true;pushV=[1], popV=[2] -> false。

总结

通过这道题的分析,我们深入理解了以下几个重要概念:

  1. 栈的模拟:通过辅助栈来模拟实际的压栈弹栈过程
  2. 双指针技巧:使用两个指针分别跟踪压栈和弹栈的进度
  3. 贪心策略:每当栈顶元素与期望弹出元素匹配时,立即弹出
  4. 算法验证:通过最终栈是否为空来验证序列的合法性

这种模拟法不仅适用于栈的相关问题,在很多其他算法场景中也有广泛应用。掌握这种思维方式,对于提升算法设计能力具有重要意义。

参考链接

  1. LeetCode 946. 验证栈序列
  2. 数据结构与算法 - 栈的应用
  3. C++ STL stack 容器详解

目录

  1. 题目描述
  2. 核心思路
  3. 完整代码实现
  4. 算法步骤详解
  5. 执行过程模拟
  6. 算法复杂度分析
  7. 时间复杂度
  8. 空间复杂度
  9. 边界情况处理
  10. 空序列处理
  11. 单元素序列
  12. 总结
  13. 参考链接
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • GitHub Copilot 学生认证指南:免费获取 Pro 版权限
  • Flutter google_generative_language_api 适配鸿蒙 HarmonyOS 实战指南
  • 毕业论文 AI 辅助写作全流程实操指南
  • 利用 AI 高效完成高质量文献综述:实操步骤与提示词指南
  • Spring Boot 4 新特性:Jackson 3 ObjectMapper 异常处理简化,无需 try-catch
  • 使用 Web Unlocker API 高效抓取亚马逊数据
  • Ubuntu 20.04 快速安装 Miniconda 指南
  • iPad 端 Obsidian 结合 Gitee 实现 Git 同步实战
  • 前端首屏加载时间度量:深入理解 FCP、LCP 等核心指标
  • AI 辅助游戏开发:基于 DeepSeek 构建贪吃蛇游戏
  • Angular 框架介绍:企业级前端开发
  • 中国移动发布九天海算政务大模型及客服大模型
  • MySQL 为什么需要双写缓冲区,redo log 为何不双写
  • Python 字节码逆向工具 pycdc 安装与使用指南
  • SmolVLA 高算力适配:TensorRT 加速可行性分析与 ONNX 导出实操
  • 从语言模型蒸馏视觉推理能力:基于代码中介的数据合成方法
  • GPU 算力云服务的技术探索与 AIGC 应用支持
  • Windows 11 本地部署 OpenClaw:集成 Telegram 机器人与网页搜索功能
  • PHP 构建智能家居自动化系统:场景模式开发全解析
  • Snowflake Arctic 开源:4800 亿参数 MoE 模型性能解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online