文章目录

◆ 博主名称:此生决int
大家好,欢迎来到我的博客~
⭐ 个人专栏:快速复习系列
⭐ 热门专栏:算法基础到精通系列
文章概要
** 本文介绍了栈和队列的数据结构及其应用。栈和队列分别介绍了两道非常经典的算法题(重点)**
栈
1.1栈的概念及结构
- 栈顶与栈底
- 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
- 压栈和出栈 :
- 入栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。
- 出栈:栈的删除操作叫做出栈。出数据也在栈顶。
1.2栈的实现
栈的实现一般可以使用数组或者链表实现,相对而言数组 的结构实现更优一些。因为数组在尾上插入数据的代价比较小 。
- 用数组实现栈:
//使用一个数组来存储栈中的元素,
//使用一个变量来记录栈顶元素的位置;
- 用链表实现栈
//使用一个链表来存储栈中的元素,
//使用一个指针来记录栈顶元素的位置;
3.用双端队列实现栈:
//使用一个双端队列来存储栈中的元素,
//使用一个指针来记录栈顶元素的位置;
栈的主要应用
括号匹配问题⭐️

思路 ;模拟这题会发现这题的过程类似于消除游戏,只要用匹配的括号就消除,看看最后是否可以消除干净。我们就可以用栈来模拟这个过程。
cpp
class Solution {
public:
bool isValid(string s) {
// 解题思路:使用栈(Stack)来模拟括号匹配。
// 遇到左括号入栈,遇到右括号则检查栈顶是否能匹配。
// 最后栈为空表示全部匹配成功。
stack<char> st; // 定义一个栈,用来暂存左括号
for(int i = 0; i < s.size(); i++) // 遍历输入字符串
{
// 遇到左括号:入栈一步
if(s[i] == '[' || s[i] == '{' || s[i] == '(')
{
st.push(s[i]); // 将当前左括号压入栈顶
}
else // 否则就是遇到了右括号
{
// 情况1:栈已经空了,说明没有对应的左括号,直接返回 false
if(st.empty()) {
return false;
}
// 情况2:检查当前右括号是否与栈顶的左括号匹配
// 如果栈顶元素和当前右括号不匹配,说明括号顺序或类型错误
if((s[i] == ']' && st.top() != '[') ||
(s[i] == '}' && st.top() != '{') ||
(s[i] == ')' && st.top() != '('))
{
return false;
}
// 如果匹配成功,弹出栈顶的左括号,继续处理下一个字符
st.pop();
}
}
// 遍历结束后,检查栈是否为空
// 栈为空,说明所有括号都正确闭合了,返回 true
if(st.empty())
return true;
else
return false; // 栈不为空,说明有左括号没闭合
}
};
队列
2.2队列的实现
队列也可以数组和链表的结构实现,使用链表 的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。
- 用链表实现队列
- 使用一个链表来存储队列中的元素,
- 使用两个指针来分别记录队头和队尾元素的位置;
- 用双端队列实现队列
- 使用一个双端队列来存储队列中的元素,
- 使用两个指针来分别记录队头和队尾元素的位置;
队列的主要应用
BFS⭐️⭐️⭐️
cpp
class Solution {
// 定义四个方向:下、右、上、左
int dx[4] = {1, 0, -1, 0};
int dy[4] = {0, 1, 0, -1};
public:
vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color) {
// 获取图像的尺寸
int m = image.size(); // 行数
int n = image[0].size(); // 列数
// 记录起始点的原始颜色
int oldcolor = image[sr][sc];
// 如果目标颜色和原始颜色相同,无需操作,直接返回原图
if (oldcolor == color) return image;
// 使用队列进行BFS遍历
queue<pair<int, int>> q;
// 将起始坐标入队
q.push({sr, sc});
while (!q.empty()) {
// 取出队首元素
pair<int, int> cur = q.front();
q.pop();
// 修改当前格子颜色
image[cur.first][cur.second] = color;
// 遍历四个方向
for (int i = 0; i < 4; i++) {
int x = cur.first + dx[i];
int y = cur.second + dy[i];
// 1. 检查坐标是否越界
// 2. 检查邻居是否和原始颜色相同
if (x >= 0 && y >= 0 && x < m && y < n && image[x][y] == oldcolor) {
q.push({x, y}); // 将符合条件的邻居入队,等待处理
}
}
}
// 返回修改后的图像
return image;
}
};
BFS还有非常多的内容,这里先做一个简单的介绍,想要更系统全面的学习BFS ,可以看看我的(还在制作中)文章。
结语
** 本文到此结束,欢迎各位在评论区探讨交流。需要快速复盘、精简学习内容的朋友,可订阅我的快速复习专栏,专注整合学习精华,一起稳步提升!**
