当前位置: 首页 > news >正文

stack,queue,list的区别和联系

一、总体概览

类型所属类别底层实现(默认)访问模式特点
stack容器适配器dequeLIFO(后进先出)只在一端(栈顶)操作
queue容器适配器dequeFIFO(先进先出)队尾插入、队头删除
list序列容器双向链表双向顺序访问任意位置高效插入/删除,不支持随机访问

stackqueue属于容器适配器,它们通过封装底层容器(默认deque)来提供特定的接口。
list独立的容器,直接管理内存。


二、区别与联系

1. 区别

特性stackqueuelist
元素访问只能访问栈顶top()只能访问队头front()和队尾back()双向迭代,可用begin()/end()遍历所有元素
插入操作push()(只从顶部)push()(只从尾部)push_front()/push_back()/insert()
删除操作pop()(只从顶部)pop()(只从头部)pop_front()/pop_back()/erase()
随机访问❌ 不支持❌ 不支持❌ 不支持(但可用迭代器遍历)
底层结构默认deque,也可用vector/list默认deque,也可用list双向链表
迭代器支持❌ 无迭代器❌ 无迭代器✅ 双向迭代器
常用场景深度优先搜索、表达式求值广度优先搜索、任务队列需要频繁中间插入/删除的序列

2. 联系

  • 三者都位于<stack><queue><list>头文件中。

  • 都是模板类,可存储任意类型元素。

  • 都提供empty()size()成员函数。

  • stackqueue可以基于list实现:stack<int, list<int>>

  • 三者都不支持随机访问迭代器。


三、stack详解

定义

#include <stack> std::stack<T, Container> s; // Container 默认 deque<T>

常用接口

函数说明返回值
push(const T& val)val压入栈顶void
pop()弹出栈顶元素(无返回值)void
top()返回栈顶元素的引用T&/const T&
empty()判断栈是否为空bool
size()返回栈中元素个数size_type

示例

std::stack<int> st; st.push(1); st.push(2); int top = st.top(); // 2 st.pop(); // 弹出2

四、queue详解

定义

#include <queue> std::queue<T, Container> q; // Container 默认 deque<T>

常用接口

函数说明返回值
push(const T& val)val放入队尾void
pop()弹出队头元素(无返回值)void
front()返回队头元素的引用T&/const T&
back()返回队尾元素的引用T&/const T&
empty()判断队列是否为空bool
size()返回队列中元素个数size_type

示例

std::queue<int> q; q.push(1); q.push(2); int front = q.front(); // 1 int back = q.back(); // 2 q.pop(); // 移除1

五、list详解

定义

#include <list> std::list<T> lst;

常用接口(按功能分组)

1. 迭代器(遍历用)
函数说明
begin()/end()正向迭代器
rbegin()/rend()反向迭代器
cbegin()/cend()const 正向迭代器
2. 容量
函数说明
empty()是否为空
size()元素个数
3. 访问(仅支持首尾直接访问)
函数说明
front()返回第一个元素的引用
back()返回最后一个元素的引用
4. 插入与删除
函数说明
push_front(const T& val)头部插入
pop_front()删除头部元素
push_back(const T& val)尾部插入
pop_back()删除尾部元素
insert(pos, val)在迭代器pos位置插入val(支持多个重载)
erase(pos)/erase(first, last)删除一个或一段元素
clear()清空所有元素
5. 特殊操作(链表特有)
函数说明
splice(pos, other)将另一个 list 的元素移动到pos
remove(const T& val)删除所有等于val的元素
remove_if(predicate)删除满足条件的元素
unique()删除连续的重复元素(需先排序)
merge(other)合并两个已排序的 list
sort()对元素排序(不支持 std::sort,用自己的成员函数)
reverse()反转链表

示例

std::list<int> lst = {1, 2, 3, 2, 4}; lst.push_front(0); // 0,1,2,3,2,4 lst.remove(2); // 删除所有2 -> 0,1,3,4 lst.sort(); // 0,1,3,4 lst.reverse(); // 4,3,1,0 // 用迭代器遍历 for (auto it = lst.begin(); it != lst.end(); ++it) { std::cout << *it << " "; }

六、使用建议与注意事项

  1. 需要 LIFO 行为stack
    需要 FIFO 行为queue
    需要任意位置插入删除,或需要双向迭代list

  2. stackqueue不提供迭代器,因此不能遍历内部元素(除非通过pop逐个取出)。

  3. list的插入/删除不会使迭代器失效(除了指向被删除元素的迭代器),这是它相对于vector的一大优势。

  4. 若想要随机访问,应使用vectordeque,而非list

  5. 三者都支持自定义底层容器,例如:

    std::stack<int, std::vector<int>> st; // 基于 vector std::queue<int, std::list<int>> q; // 基于 list

七、总结表格

操作stackqueuelist
头部插入push_front
尾部插入pushpushpush_back
中间插入insert
头部删除poppop_front
尾部删除poppop_back
访问任意位置❌ (需迭代器)
访问首元素frontfront
访问末元素topbackback
遍历所有元素✅ 迭代器
是否适配器
http://www.cnnetsun.cn/news/2581936.html

相关文章:

  • 专业级AMD锐龙硬件调试:掌握SMUDebugTool实现深度性能调优
  • 快速打造专业级网页翻页动画的终极指南:StPageFlip完全解析
  • 建议收藏|AI论文写作工具2026最新测评与推荐
  • 如何快速实现低延迟游戏串流:Moonlight安卓版完整配置指南
  • 游戏社区冷启动失败率高达83%?揭秘Lovable认证级搭建标准与5个致命避坑清单
  • 别再重装系统了!手把手教你给Ubuntu双系统无损扩容(Windows磁盘管理+ext4格式化)
  • 基于时间特征层C-GAN的时序网络流量数据生成实战
  • Cats Blender插件:从模型混乱到VRChat就绪的5分钟革命
  • 终极指南:如何快速解决Windows热键冲突的完整方案
  • 别再手动调相机了!用Cinemachine Virtual Camera的Aim与Noise,5分钟打造电影感镜头
  • 2026全球人工智能OPC模式商业洞察报告
  • 告别卡顿:我是如何用Profiler给模拟器里的Unity游戏做‘深度体检’的
  • UE5 WidgetComponent鼠标交互保姆级教程:从控件蓝图到3D UI点击,手把手搞定
  • 告别枯燥Demo:用OpenCV+Unity打造你的第一个AR小游戏(从图像处理到游戏逻辑全流程)
  • 从PointA到PRB:解码NR物理层资源定位与分配的完整链路
  • Unity多语言本地化终极方案:自动翻译、字体适配与UI自适应
  • Unity+MediaPipe人体姿态驱动:逆向工程实战避坑指南
  • 如何用AI视觉助手实现桌面自动化控制:终极指南
  • RabbitMQ 发送方确认与重试机制
  • 机器学习赋能城市微出行:从需求预测到安全增强的实战解析
  • 在Node.js后端项目中集成Taotoken实现稳定AI服务
  • 量子机器学习模型评估新指标:傅里叶系数相关性(FCC)原理与应用
  • 对比直接使用原厂 API 体验 Taotoken 在接入效率上的提升
  • 迅速蜘蛛池正确使用方法及注意事项
  • 明日方舟桌宠Ark-Pets:3大核心技术突破打造智能虚拟角色引擎
  • HR筛选简历和办理入离职总是耗时耗力?极客老王带你拆解2026招聘自动化真相
  • 通过用量看板观测Taotoken API调用成本与延迟的体验
  • 机器学习预测高熵合金硬度:LightGBM与BERT迁移学习实战对比
  • 034、神经网络编译器:从TensorFlowPyTorch到NPU指令
  • AMBTC压缩医学图像数据隐藏:HEP-DHMI方案原理与工程实现详解