c++中如何使用stack栈容器_c++ stack用法示例

12次阅读

std::stack需用push逐个初始化,不支持花括号初始化;top()返回顶引用,pop()仅移除且返回void,须先empty()检查;无迭代器或find,因严格遵循LIFO设计。

c++中如何使用stack栈容器_c++ stack用法示例

如何声明和初始化一个 std::stack

标准库std::stack 是容器适配器,不是独立容器,它默认底层用 std::deque 实现,也可以显式指定为 std::vectorstd::list。不支持直接用花括号初始化(如 {1,2,3}),必须逐个 push

  • 最常用写法:
    std::stack s;
  • 指定底层容器:
    std::stack> s_vec;
  • 从已有容器构造(需手动 push):
    std::vector v = {1, 2, 3};
    std::stack s;
    for (int x : v) s.push(x); // 3 入栈后,栈顶是 3

pushtoppop 的正确调用顺序

top() 返回顶元素的引用,但不移除;pop() 移除栈顶但不返回值 —— 这是初学者最容易出错的地方:不能写 s.pop().valueauto x = s.pop(),因为 pop() 返回 void

  • 安全读取并弹出:
    if (!s.empty()) {
    int x = s.top();
    s.pop();
    // 使用 x
    }
  • 错误写法(编译失败):
    int x = s.pop(); // ❌ error: void value not ignored
  • 访问空栈的 top()pop() 是未定义行为,务必先检查 empty()

为什么 std::stack 没有迭代器和 find

std::stack 是严格 LIFO 接口封装,设计上就禁止随机访问或遍历。它只提供 top()push()pop()size()empty() 这 5 个成员函数。如果你需要查找、遍历、中间插入/删除,说明不该用 stack —— 改用 std::vectorstd::deque 更合适。

  • 想“查看所有元素”?只能靠循环 pop + 临时存储,但会破坏原栈:
    std::stack tmp;
    while (!s.empty()) {
    std::cout << s.top() << " ";
    tmp.push(s.top());
    s.pop();
    }
    // 再把 tmp 倒回去(如果还要保留原数据)
  • 性能提示:反复 push/pop 模拟遍历,时间复杂度 O(n),且容易逻辑翻转(栈是倒序的)

常见编译错误和类型匹配陷阱

std::stack 模板参数必须明确,不能依赖自动推导(c++17 也不支持 CTAD for stack),且底层容器类型必须满足特定要求(如支持 push_backpop_backback())。

立即学习C++免费学习笔记(深入)”;

  • 错误:忘记模板参数或写错顺序
    std::stack s; // ❌ 缺少类型
    std::stack> s; // ✅ 合法,但 list 不如 deque 默认高效
  • 错误:用不支持的容器作为底层
    std::stack> s; // ❌ set 没有 back() 和 push_back()
  • 注意:stack 不重载 operator==,两个栈不能直接用 == 比较,得手动逐个 pop 对比

实际项目里,只要栈深度可控、操作符合 LIFO 场景,std::stack 就很可靠;一旦开始想“能不能看第 3 个元素”或者“能不能在中间删一个”,就是接口误用的明确信号。

text=ZqhQzanResources