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

文章目录

◆ 博主名称:此生决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 ,可以看看我的(还在制作中)文章。

结语

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

相关推荐
wljy11 天前
二、进制状态转换
linux·运维·服务器·c语言·c++
云泽8081 天前
笔试算法 -位运算篇(二):从唯一字符到消失数字
c++·算法·位运算
繁华落尽,倾城殇?1 天前
[C++11] : atomic,nullptr,default/delete,enum class
开发语言·c++·c++11·nullptr·atomic·enum class·default/delete
代码村新手1 天前
C++-二叉搜索树
开发语言·c++
智者知已应修善业1 天前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业1 天前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
小娄~~1 天前
C语言卷子错题集
c语言·开发语言·数据结构
过期动态1 天前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展
玖釉-1 天前
二叉树展开为链表:从先序遍历到原地指针重排
c++·windows·算法·leetcode·链表
05候补工程师1 天前
【408考研·数据结构专题】二叉树、树与森林、线索树及哈夫曼树核心考点与秒杀技巧深度总结
数据结构·经验分享·笔记·考研·算法