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

stack 是后进先出,queue 是先进先出
这是最根本的 区别 ,直接决定它们的接口设计和使用场景。stack 只允许在 栈顶(top())插入(push())和删除(pop()),不提供随机访问;queue 则维护队首(front())和队尾(back())两个端点,只允许在队尾入、队首出。两者都不支持 operator[] 或迭代器遍历(除非手动转存)。
底层容器默认不同,但都可自定义
stack 默认用 deque,queue 也默认用 deque,但实际中:stack 常被显式指定为 vector(因连续内存 + 尾部操作高效);queue 较少换底层,因为 deque 的首尾操作都是 O(1),而 vector 不支持高效头部弹出。
-
stack合法且常见> s; -
queue编译失败:缺少> q; pop_front() -
queue合法,但通常没必要> q2;
接口函数名和语义差异明显,混用会编译报错
比如想取“下一个待处理元素”,stack 用 top(),queue 用 front();想添加新元素,stack 用 push(),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 或任务调度,选错容器会导致逻辑错乱而非仅性能下降。底层容器可配,但别为了“看起来更省内存”强行换 vector 给 queue ——它根本跑不起来。