快速复习之数据结构篇——栈和队列

文章目录

◆ 博主名称:此生决int

大家好,欢迎来到我的博客~

⭐ 个人专栏:快速复习系列

⭐ 热门专栏:算法基础到精通系列

文章概要

**  本文介绍了栈和队列的数据结构及其应用。栈和队列分别介绍了两道非常经典的算法题(重点)**

1.1栈的概念及结构

  1. 栈顶与栈底
  2. 进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。
  3. 压栈和出栈
  4. 入栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶
  5. 出栈:栈的删除操作叫做出栈。出数据也在栈顶

1.2栈的实现

栈的实现一般可以使用数组或者链表实现,相对而言数组 的结构实现更优一些。因为数组在尾上插入数据的代价比较小

  1. 用数组实现栈:

//使用一个数组来存储栈中的元素,

//使用一个变量来记录栈顶元素的位置;

  1. 用链表实现栈

//使用一个链表来存储栈中的元素,

//使用一个指针来记录栈顶元素的位置;

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 ,可以看看我的(还在制作中)文章。

结语

**  本文到此结束,欢迎各位在评论区探讨交流。需要快速复盘、精简学习内容的朋友,可订阅我的快速复习专栏,专注整合学习精华,一起稳步提升!**

相关推荐
昵称小白1 小时前
子串专题部分
数据结构·算法·哈希算法
H_BB1 小时前
第17届蓝桥杯备战历程
c++·算法·职场和发展·蓝桥杯
daad7772 小时前
记录一次上下文切换次数的统计
服务器·c++·算法
tankeven2 小时前
C++ Lambda 表达式
c++
fangzt20102 小时前
插件系统:让其他人也能给编辑器写节点
c++
诙_2 小时前
深入理解C++文件操作
开发语言·c++
ShoreKiten2 小时前
cpp考前急救
数据结构·c++·算法
Byron Loong2 小时前
【基础】c,c++编译过程
c语言·c++
Hesionberger2 小时前
LeetCode79:单词搜索DFS回溯详解
java·开发语言·c++·python·算法·leetcode·c#