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

3次阅读

栈是后进先出、队列是先进先出,决定接口与使用场景:栈仅栈顶操作(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 ——它根本跑不起来。

星耀云
版权声明:本站原创文章,由 星耀云 2026-01-06发表,共计1140字。
转载说明:转载本网站任何内容,请按照转载方式正确书写本站原文地址。本站提供的一切软件、教程和内容信息仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。
text=ZqhQzanResources