queue和stack是C++容器适配器,基于deque等容器封装,分别实现FIFO和LIFO语义;queue支持push/pop/front/back,stack支持push/pop/top;均无迭代器、不支持随机访问,且pop不返回值。
在 C++ 标准库中,queue 和 stack 是容器适配器(container adapters),不是独立的底层数据结构,而是基于其他容器(如 deque、vector 或 list)封装而成,提供了受限的接口:只允许在特定位置插入/删除元素,符合队列(FIFO)和栈(LIFO)的逻辑。
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::deque,仅暴露栈顶操作:压栈(push)、弹栈(pop)、访问栈顶(top)。
基本用法示例:
#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_back 和 pop_front,所以 vector 不能直接用于 queue(缺少 pop_front)初学者容易混淆的点:
queue 和 stack 不是“可以遍历的容器”,没有 begin()/end(),也不支持下标访问pop() 系列函数都不返回值——想获取再删除,需先 front()/top(),再 pop()
vector + 算法)
掌握这两个适配器的关键是理解“接口限制”背后的意图:让代码更清晰地表达 FIFO 或 LIFO 的业务语义,而不是纠结于底层实现。用对了,能显著提升逻辑可读性和维护性。