《C++ Stack 与 Queue 完全使用指南:基础操作 + 经典场景 + 实战习题》
代码语言:javascriptAI代码解释#include <stack> // 必须包含头文件// 定义栈:默认存储int类型,底层依赖deque实现// 可指定底层容器(如vector、list)// 基于vector的栈// 基于list的栈代码语言:javascriptAI代码解释#include <queue> // 必须包含的头文件// 定义队列:默认底层依赖deque实现// 可指定
一. 先搞懂基础:Stack 与 Queue 的核心特性
在写代码前,首先要明确两者的 “数据访问规则”—— 这是它们区别于其他容器的关键:
|
容器 |
核心规则 |
访问特性 |
适用场景 |
|---|---|---|---|
|
stack |
后进先出(LIFO) |
仅能访问“栈顶”元素 |
函数调用栈、表达式求值、撤销操作 |
|
queue |
先进先出(FIFO) |
仅能访问“队头”和“队尾”元素 |
任务调度、消息队列、广度优先搜索(BFS) |
两者的共性是 “限制访问”:不支持随机访问(如 [] 下标),也不支持迭代器遍历 —— 目的是强制遵循其数据规则,避免错误的访问方式
二. Stack(栈):后进先出(LIFO)的容器
2.1 核心特性:
- 访问规则:只能从"栈顶"添加或删除元素(最后入栈的元素最先出栈)
- 适用场景:函数调用栈,表达式求值等。

在这里插入图片描述
2.2 头文件与定义
代码语言:javascript
AI代码解释
#include <stack> // 必须包含头文件
using namespace std;
// 定义栈:默认存储int类型,底层依赖deque实现
stack<int> st;
// 可指定底层容器(如vector、list)
stack<int, vector<int>> st_v; // 基于vector的栈
stack<int, list<int>> st_l; // 基于list的栈
2.3 常用接口全解析
|
接口 |
功能描述 |
示例 |
|---|---|---|
|
push(val) |
向栈顶添加元素,新元素成为新的栈顶 |
st.push(10); |
|
pop() |
删除当前栈顶元素(操作后原栈顶的下一个元素成为新栈顶),无返回值,需先确保栈非空 |
st.pop(); |
|
top() |
返回栈顶元素的引用(可直接读取或修改栈顶值),需先确保栈非空 |
int x = st.top();(读取);st.top() = 20;(修改) |
|
size() |
返回栈中当前存储的元素总个数,返回值为无符号整数(size_t) |
cout << st.size(); |
|
empty() |
判断栈是否为空,若栈中无元素则返回 true,否则返回 false |
if (st.empty()) { ... } |
2.4 基础用法演示
代码语言:javascript
AI代码解释
void test_stack()
{
stack<int> st;
st.push(1);
st.push(2);
st.push(3);
st.emplace(4);
while (!st.empty())
{
cout << st.top() << " ";
st.pop();
}
cout << endl;
}
int main()
{
test_stack();
}

在这里插入图片描述
三. Queue(队列):先进先出(FIFO)的容器
3.1 核心特性:
- 访问规则:从"队尾"添加元素,从"队头"删除元素(最先入队的元素最先出队)
- 适用场景:任务调度(如打印队列)、消息队列、广度优先搜索(BFS)等

在这里插入图片描述
3.2 头文件与定义:
代码语言:javascript
AI代码解释
#include <queue> // 必须包含的头文件
using namespace std;
// 定义队列:默认底层依赖deque实现
queue<int> q;
// 可指定底层容器(如list,不建议用vector,因vector头删效率低)
queue<int, list<int>> q_l; // 基于list的队列
3.3 常用接口全解析
|
接口 |
功能描述 |
示例 |
|---|---|---|
|
push(val) |
向队列的队尾添加一个元素,新元素成为队列的最后一个元素,操作后队列长度+1 |
q.push("任务1"); |
|
pop() |
删除队列的队头元素(即最早入队的元素),操作后队列长度-1,无返回值(需先通过 front() 获取队头元素再删除) |
q.pop(); |
|
front() |
返回队列队头元素的引用(可读取或修改),仅访问不删除,需确保队列非空 |
string task = q.front();(读取);q.front() = "优先任务1";(修改) |
|
back() |
返回队列队尾元素的引用(可读取或修改),仅访问不删除,需确保队列非空 |
string last = q.back();(读取);q.back() = "最后任务";(修改) |
|
size() |
返回队列中当前存储的元素总个数,返回值类型为 size_t(无符号整数) |
cout << q.size(); |
|
empty() |
判断队列是否为空:若队列中无元素则返回 true,有元素则返回 false,常用于遍历或删除前判断队列状态 |
if (q.empty()) { cout << "队列为空"; } |
3.4 基础用法演示
代码语言:javascript
AI代码解释
void test_queue()
{
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.emplace(4);
while (!q.empty())
{
cout << q.front() << " ";
q.pop();
}
cout << endl;
}
int main()
{
//test_stack();
test_queue();
}

在这里插入图片描述
四. 实战练习题
4.1 最小栈
题目链接:
题目描述:

在这里插入图片描述
题目示例:

在这里插入图片描述
C++算法代码:
代码语言:javascript
AI代码解释
class MinStack {
public:
MinStack() {
//可以啥都不写,甚至可以删掉
//会去调这个自定义类型的默认构造
}
void push(int val) {
_st.push(val);
if(_minst.empty()||_minst.top()>=val)
_minst.push(val);
}
void pop() {
if(_minst.top()==_st.top())
_minst.pop();
_st.pop();
}
int top() {
return _st.top();
}
int getMin() {
return _minst.top();
}
private:
stack<int> _st;
stack<int> _minst;
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack* obj = new MinStack();
* obj->push(val);
* obj->pop();
* int param_3 = obj->top();
* int param_4 = obj->getMin();
*/
图解:

在这里插入图片描述
4.2 栈的压入、弹出序列
题目链接:
题目描述:

在这里插入图片描述
题目示例:

在这里插入图片描述
C++算法代码:
代码语言:javascript
AI代码解释
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pushV int整型vector
* @param popV int整型vector
* @return bool布尔型
*/
bool IsPopOrder(vector<int>& pushV, vector<int>& popV) {
int pushi=0,popi=0;
stack<int> st;
while(pushi<pushV.size())
{
st.push(pushV[pushi]);
while(!st.empty()&&st.top()==popV[popi])
{
st.pop();
popi++;
}
pushi++;
}
return st.empty();
}
};
图解:

在这里插入图片描述
更多推荐



所有评论(0)