【C++】STL:Stack详解

STL:Stack详解

说到 C++ 的 STL(Standard Template Library)容器,vectormapset 这些可能更常被使用。但在某些特定的应用场景下,stack(栈)却能带来意想不到的简洁和高效。


一、stack 是啥?

stack,中文叫"栈",是 后进先出(LIFO) 的线性数据结构。 也就是说:你最后压进去的元素,会第一个被弹出来

举个现实中的例子: 你往一个盒子里一个一个地放盘子(push),最后放进去的盘子在最上面,如果现在要拿一个盘子出来,你只能从最上面开始拿(pop)。

在 C++ 中,stack 就是对这种行为的一种封装。

(其实这些大家在学数据结构的时候应该都有所了解了)


二、stack 的基本用法

cpp 复制代码
#include <iostream>
#include <stack>

int main() {
    std::stack<int> s;

    s.push(10);     // 压入10
    s.push(20);     // 压入20
    s.push(30);     // 压入30

    std::cout << "栈顶元素:" << s.top() << std::endl;  // 输出30

    s.pop();  // 弹出30

    std::cout << "现在栈顶是:" << s.top() << std::endl;  // 输出20

    return 0;
}

stack 的常用操作

操作名 含义 说明
push() 入栈 把元素放入栈顶
pop() 出栈 弹出栈顶元素(不返回)
top() 查看栈顶 返回栈顶元素
empty() 是否为空 栈为空返回 true
size() 元素数量 返回当前栈中元素的数量

三、stack 本质上是个"适配器"

stack 是一个容器,其实它的底层是对其他容器的"包装"。 它不是一个容器类,而是一个容器适配器(container adapter)。

什么意思?

在源码中,stack 默认是用 deque 作为底层容器来实现的。你也可以换成 vector 等,只要它支持:

  • push_back()
  • pop_back()
  • back()
cpp 复制代码
std::stack<int, std::vector<int>> myStack;  // 用 vector 作为底层容器

所以说,stack 只是把底层容器的接口"裁剪"了一下,只保留了能实现"栈"操作的那一部分。

适配器这个东西也很有讲头,如果大家喜欢的话,我后续会出一期~


四、常见应用场景

很多经典算法,背后都有 stack 的影子:

  • 括号匹配:判断表达式是否配对,经典栈应用。
  • 中缀转后缀表达式:用来临时保存运算符。
  • 深度优先搜索(DFS):显式栈代替递归。
  • 浏览器的前进后退:前进栈 + 后退栈。
cpp 复制代码
// 一个简单的括号匹配
bool isValidBrackets(const std::string& s) {
    std::stack<char> st;
    for (char c : s) {
        if (c == '(') st.push(c);
        else if (c == ')') {
            if (st.empty()) return false;
            st.pop();
        }
    }
    return st.empty();
}

五、栈的性能与注意事项

  • stack 的每次操作都是 常数时间 O(1),性能非常好。
  • 不支持迭代器遍历(你不能用 for 去遍历它),这也是刻意设计的,因为栈的原则就是 只能看最上面的那个元素
  • 如果你需要频繁地遍历或随机访问,stack 可能不是最佳选择,考虑用 vectordeque

六、总结一下

  • C++ 的 stack 是 STL 提供的容器适配器,封装了"后进先出"的数据结构;
  • 默认使用 deque 作为底层容器;
  • 提供简单高效的 push/pop/top/empty/size 接口;
  • 是括号匹配、DFS、表达式求值等算法的利器;
  • 若有遍历需求,需另选容器。

简单的一篇STL容器讲解,大家的支持就是我更新的动力~

相关推荐
易ლ拉罐17 分钟前
【C++】封装,this指针
c++
独好紫罗兰1 小时前
C++信息学奥赛一本通-第一部分-基础一-第一章
c++·算法
郝学胜-神的一滴1 小时前
对于类似std::shared_ptr但有可能空悬的指针使用std::weak_ptr: Effective Modern C++ 条款20
开发语言·c++·程序人生·系统架构
子昕2 小时前
Kimi K2+Claude Code绝配!Windows原生支持
ai编程
人生都在赌2 小时前
为什么我放弃了Zapier,选择n8n来构建AI Agent工作流?
agent·ai编程·工作流引擎
子昕2 小时前
有了免费的Kiro,这次真的可以把Cursor扔了!
ai编程
Murphy_lx2 小时前
C++ stdset 与 stdmultiset 深度比较
开发语言·c++
Jooolin2 小时前
【C++】C++中的模板是个啥机制?好用吗?
c++·ai编程·编程语言
Stanford_11062 小时前
关于大数据的基础知识(三)——数据安全与合规
大数据·网络·c++·物联网·学习·微信小程序·微信开放平台