c++如何使用标准库中的queue和stack 队列和栈的实现【数据结构】

11次阅读

queue 和 stack 是 C ++ 容器适配器,基于 deque 等容器封装,分别实现 FIFO 和 LIFO 语义;queue 支持 push/pop/front/back,stack 支持 push/pop/top;均无迭代器、不支持随机访问,且 pop 不返回值。

c++ 如何使用标准库中的 queue 和 stack 队列和栈的实现【数据结构】

在 C++ 标准库 中,queuestack 是容器适配器(container adapters),不是独立的底层数据结构,而是基于其他容器(如 dequevectorlist)封装而成,提供了受限的接口:只允许在特定位置插入 / 删除元素,符合队列(FIFO)和 (LIFO)的逻辑。

如何使用 std::queue(队列)

std::queue 默认底层使用 std::deque,支持在队尾入队(push)、队首出队(pop),并可通过 front()back() 访问首尾元素。它不提供迭代器,也不能随机访问。

基本用法示例:

  • 包含头文件:#include
  • 声明:例如 std::queue q;(默认基于 deque)
  • 常用操作:
    • q.push(x):将 x 入队(队尾)
    • q.front():访问队首元素(不移除)
    • q.back():访问队尾元素(不移除)
    • q.pop():移除队首元素(不返回值)
    • q.empty()q.size():判断空、获取长度
  • 注意:front()pop() 必须在非空时调用,否则行为未定义;建议先用 empty() 检查

如何使用 std::stack(栈)

std::stack 同样是容器适配器,默认底层也用 std::deque,仅暴露栈顶操作:压栈(push)、弹栈(pop)、访问栈顶(top)。

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

基本用法示例:

  • 包含头文件:#include
  • 声明:例如 std::stack s;
  • 常用操作:
    • s.push(x):x 压入栈顶
    • s.top():访问栈顶元素(不移除)
    • s.pop():移除栈顶元素(不返回值)
    • s.empty()s.size():判空、查大小
  • 注意:top()pop() 都要求栈非空;top() 返回的是引用,可读可写(若元素类型允许)

自定义底层容器(进阶用法)

你可以显式指定底层容器,从而影响性能或内存特性。例如:

  • std::queue> q_list;:用 list 实现 queue(适合频繁插入删除但对缓存不敏感的场景)
  • std::stack> s_vec;:用 vector 实现 stack(连续内存,cache 友好,但扩容有代价)
  • 注意:所选容器必须支持必要操作,比如 queue 要求容器有 push_backpop_front,所以 vector 不能直接用于 queue(缺少 pop_front

常见误区与提醒

初学者容易混淆的点:

  • queuestack 不是“可以遍历的容器”,没有 begin()/end(),也不支持下标访问
  • pop() 系列函数都不返回值——想获取再删除,需先 front()/top(),再 pop()
  • 它们不提供查找、排序、去重等功能,这些需自行处理或换用其他容器(如 vector + 算法)
  • 多线程环境下,标准库容器本身不保证线程安全;如需 并发访问,应加锁或使用专用并发结构

掌握这两个适配器的关键是理解“接口限制”背后的意图:让代码更清晰地表达 FIFO 或 LIFO 的业务语义,而不是纠结于底层实现。用对了,能显著提升逻辑可读性和维护性。

text=ZqhQzanResources