一、总体概览

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

stack 和 queue 属于容器适配器,它们通过封装底层容器(默认 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() 成员函数。

  • stack 和 queue 可以基于 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. stack 和 queue 不提供迭代器,因此不能遍历内部元素(除非通过 pop 逐个取出)。

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

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

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

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


七、总结表格

操作stackqueuelist
头部插入✅ push_front
尾部插入✅ push✅ push✅ push_back
中间插入✅ insert
头部删除✅ pop✅ pop_front
尾部删除✅ pop✅ pop_back
访问任意位置❌ (需迭代器)
访问首元素✅ front✅ front
访问末元素✅ top✅ back✅ back
遍历所有元素✅ 迭代器
是否适配器
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐