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

STL stack 与 queue 底层模拟实现及算法实战

STL 容器适配器 stack 和 queue 基于底层容器封装实现。二者原理、手动模拟代码及最小栈、逆波兰表达式等经典算法题解法,帮助深入理解数据结构设计与应用。

云朵棉花糖发布于 2026/3/25更新于 2026/7/2336 浏览
STL stack 与 queue 底层模拟实现及算法实战

STL 中的 stack 和 queue 本质是容器适配器,它们基于基础容器(如 vector、deque)封装,屏蔽复杂接口,只暴露特定操作逻辑。这种设计让我们能直接按栈或队列的经典逻辑使用数据,同时享受底层容器的性能优势。

容器适配器原理

适配器就像'转换器',把不兼容的对象改造为适配特定场景的形式。容器适配器包装底层容器,限制访问方式。例如 stack 遵循后进先出(LIFO),只允许在尾部操作;queue 遵循先进先出(FIFO),队尾入队、队头出队。priority_queue 则关注优先级最高的元素。正因为适配器限制了遍历权限以维护结构特性,所以它们不支持迭代器。

Stack 模拟实现

Stack 默认底层容器是 deque,也可以是 vector 或 list。核心要求是支持 empty、back、push_back、pop_back。

template<class T, class Container = std::deque<T>>
class stack {
public:
    void push(const T& x) { _con.push_back(x); }
    void pop() { _con.pop_back(); }
    const T& top() { return _con.back(); }
    bool empty() { return _con.empty(); }
    size_t size() { return _con.size(); }
private:
    Container _con;
};

这里所有操作都委托给 _con。编译器会自动生成默认成员函数,因为 stack 本身不管理额外资源,底层容器已处理内存。注意 top() 返回 const 引用,防止外部修改栈顶数据。

Queue 模拟实现

Queue 需要支持 front、back、push_back、pop_front。默认也是 deque。

template<class T, class Container = std::deque<T>>
class queue {
public:
    void push(const T& x) { _con.push_back(x); }
    void pop() { _con.pop_front(); }
    const T& front() { return _con.front(); }
    const T& back() { return _con.back(); }
    bool empty() { return _con.empty(); }
    size_t size() { return _con.size(); }
private:
    Container _con;
};

入队复用 push_back,出队复用 pop_front。同样依赖底层容器的随机访问能力。

典型算法场景

最小栈

需要在 O(1) 时间内获取最小值。思路是用两个栈:一个存数据,一个存历史最小值。新元素入栈时,若小于等于最小栈顶,也压入最小栈;弹出时若相等,同步弹出。

class MinStack {
public:
    void push(int val) {
        _st.push(val);
        if(_minst.empty() || val <= _minst.top()) {
            _minst.push(val);
        }
    }
    void pop() {
        if(!_minst.empty() && _minst.top() == _st.top()) {
            _minst.pop();
        }
        _st.pop();
    }
    int getMin() { return _minst.top(); }
private:
    std::stack<int> _st;
    std::stack<int> _minst;
};

注意空栈保护,实际工程中需判断栈非空再访问 top。

栈的压入弹出序列

验证一个序列是否可能是另一个序列的弹出顺序。模拟入栈过程,每当栈顶匹配弹出序列当前元素,就弹出并移动指针。最后栈空即合法。

bool IsPopOrder(std::vector<int>& pushV, std::vector<int>& popV) {
    std::stack<int> st;
    int pushi = 0, popi = 0;
    while(pushi < pushV.size()) {
        st.push(pushV[pushi++]);
        while(!st.empty() && st.top() == popV[popi]) {
            st.pop();
            popi++;
        }
    }
    return st.empty();
}

内层循环处理连续弹出的情况,比单层判断更高效。

逆波兰表达式求值

后缀表达式计算。遇到数字入栈,遇到运算符弹出两个数运算后结果入栈。

int evalRPN(std::vector<std::string>& tokens) {
    std::stack<int> st;
    for(auto& e : tokens) {
        if(e == "+" || e == "-" || e == "*" || e == "/") {
            int right = st.top(); st.pop();
            int left = st.top(); st.pop();
            switch(e[0]) {
                case '+': st.push(left+right); break;
                case '-': st.push(left-right); break;
                case '*': st.push(left*right); break;
                case '/': st.push(left/right); break;
            }
        } else {
            st.push(stoi(e));
        }
    }
    return st.top();
}

这里简化了运算符判断逻辑,实际需区分加减乘除。

用栈实现队列 & 用队列实现栈

利用双栈倒序实现队列功能:一个栈负责入队,另一个负责出队。当出栈栈空时,将入栈栈全部倒入。 反之,用双队列实现栈:始终向非空队列加元素,出栈时将 n-1 个元素移入空队列,最后一个即为栈顶。

这些练习不仅巩固了 STL 用法,更加深了对数据结构转换的理解。掌握这些模式,面对复杂场景时能更快找到切入点。

目录

  1. 容器适配器原理
  2. Stack 模拟实现
  3. Queue 模拟实现
  4. 典型算法场景
  5. 最小栈
  6. 栈的压入弹出序列
  7. 逆波兰表达式求值
  8. 用栈实现队列 & 用队列实现栈
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • MCPHost:命令行下通过 MCP 协议与大模型及外部工具交互的工具
  • Flutter 三方库 arcane_helper_utils 鸿蒙化适配指南
  • Java 随机数实战:从范围字符串解析到动态区间生成
  • FPGA 开发入门:基于 Quartus 实现 LED 控制
  • Edge 边栏 Copilot 图标消失修复方案
  • QClaw 上手指南:本地 AI 代理的桌面化实践
  • 积木报表快速入门:从零开始设计数据可视化报表
  • Video2Robot:从视频到机器人动作的端到端生成管道
  • AI 绘画提示词生成器的效率优化实践:从原理到工程实现
  • AI 鸿蒙 App 开发:从页面到能力系统的架构变革
  • 斯坦福 2025 AI Index Report 核心洞察:从技术突破到系统扩散
  • 基于FPGA的CARRY4 抽头延迟链TDC延时仿真
  • Spring Bean 作用域、生命周期与自动装配源码解析
  • 昇腾平台下 DeepSeek-R1 与 Qwen2.5 强化学习训练优化实践
  • 程序员为何要尽早掌握基础知识与设计模式
  • WebLaTeX:基于 VSCode 的云端 LaTeX 写作平台
  • AIGC 个性化与定制化内容生成:技术原理与应用场景
  • AI 网络技术编程测试:从理论到实践
  • AI 驱动下内存价格暴涨原因与能源隐私绿色趋势解析
  • Flask 结合 OpenCV 的虚拟视点合成视差估计算法实现

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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