c++ stack和queue区别_c++栈与队列容器详解

16次阅读

是后进先出、队列是先进先出,决定接口与使用场景:栈仅栈顶操作(push/pop/top),队列仅队首队尾操作(push/pop/front/back);底层默认deque,但stack可安全换vector,queue换vector则编译失败。

c++ stack和queue区别_c++栈与队列容器详解

stack 是后进先出,queue 是先进先出

这是最根本的区别,直接决定它们的接口设计和使用场景。stack 只允许在顶(top())插入(push())和删除(pop()),不提供随机访问;queue 则维护队首(front())和队尾(back())两个端点,只允许在队尾入、队首出。两者都不支持 operator[] 或迭代器遍历(除非手动转存)。

底层容器默认不同,但都可自定义

stack 默认用 dequequeue 也默认用 deque,但实际中:stack 常被显式指定为 vector(因连续内存 + 尾部操作高效);queue 较少换底层,因为 deque 的首尾操作都是 O(1),而 vector 不支持高效头部弹出。

  • stack> s; 合法且常见
  • queue> q; 编译失败:缺少 pop_front()
  • queue> q2; 合法,但通常没必要

接口函数名和语义差异明显,混用会编译报错

比如想取“下一个待处理元素”,stacktop()queuefront();想添加新元素,stackpush()queue 也用 push()(但语义是“加到队尾”)。最容易踩的坑是误把 queue::back() 当作“最后入队的元素”来取值并依赖其顺序——它只是暴露队尾,不改变逻辑结构。

stack s; s.push(1); s.push(2); // top() == 2  queue q; q.push(1); q.push(2); // front() == 1, back() == 2

没有 size() 以外的容量相关接口,empty() 比 size() == 0 更安全

两者都提供 empty()size()push()pop(),但都不提供 reserve()capacity()shrink_to_fit()。调用 top()front() 前必须确保非空,否则行为未定义——empty() 是唯一可靠的判空方式,不要写 s.size() > 0 来代替。

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

if (!s.empty()) {     int x = s.top(); // 安全 } // 错误示例: // if (s.size()) { int x = s.top(); } // size() 可能为无符号类型,但逻辑上没问题;真正危险的是没检查就调用 top()

stack 模拟递归或括号匹配,用 queue 做 BFS 或任务调度,选错容器会导致逻辑错乱而非仅性能下降。底层容器可配,但别为了“看起来更省内存”强行换 vectorqueue ——它根本跑不起来。

text=ZqhQzanResources