首页 > 编程语言 >刷题笔记——栈(C++)

刷题笔记——栈(C++)

时间:2024-01-08 23:01:22浏览次数:60  
标签:int top 笔记 stk ++ while C++ 节点 刷题

LCR 148. 验证图书取出顺序 - 力扣(LeetCode)

现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入 和 拿取 书籍。

给定一个表示图书放入顺序的整数序列 putIn,请判断序列 takeOut 是否为按照正确的顺序拿取书籍的操作序列。你可以假设放入书架的所有书籍编号都不相同。

刷题笔记——栈(C++)_C++

解题思路

模拟+辅助栈。

1° 定义一个栈stk用于存储放入的书籍,再声明一个索引p(初始化为0)记录当前要取出书籍的索引。

2° 遍历putIn数组的每本书籍(i),将每本书籍入栈,查看栈顶元素是否与需要取出的书籍takeOut[p]相同,若相同,则栈顶元素出栈,p指针右移一位,直到栈顶的元素和takeOut[p]不同。

3° 遍历完成后,检查栈是否为空,如果为空则说明所有书籍都按合法的顺序取出,返回 true;否则返回 false。

代码实现

class Solution {
public:
    bool validateBookSequences(vector<int>& putIn, vector<int>& takeOut) {
        stack<int> stk;
        int p = 0;
        for(auto& i:putIn){
            stk.push(i);
            while(!stk.empty() && stk.top() == takeOut[p]){
                stk.pop();
                p++;
            }
        }
        return stk.empty();
    }
};

1028. 从先序遍历还原二叉树 - 力扣(LeetCode)

我们从二叉树的根节点 root 开始进行深度优先搜索。

在遍历中的每个节点处,我们输出 D 条短划线(其中 D 是该节点的深度),然后输出该节点的值。(如果节点的深度为 D,则其直接子节点的深度为 D + 1。根节点的深度为 0)。

如果节点只有一个子节点,那么保证该子节点为左子节点。

给出遍历输出 S,还原树并返回其根节点 root刷题笔记——栈(C++)_数据结构与算法_02刷题笔记——栈(C++)_C++_03

解题思路

模拟递归+辅助栈。主要难点在于弄清节点是左子节点还是右子节点。在此之前要明确的是 :1° 如果节点只有一个子节点,那么保证该子节点为左子节点;2° 从先序遍历还原,遵循“根-左-右”。不妨举例弄清深度和是否为左右子节点的关系:

刷题笔记——栈(C++)_C++_04

理清大体的关系后。我们再具体通过辅助栈实现这一操作。

首先,遍历字符串s(索引p)(1),

    保存每一个节点的值(注意数字连接)(2),

    以及该节点的深度信息。(3)

创建新节点存储当前遍历到的数值,(4)

    若当前深度 == 栈内元素个数(栈不为空),说明新节点为栈顶元素左子节点;(5)

    若当前深度 < 栈内元素个数,那么循环弹出栈顶元素,(6)

    直到当前深度 == 栈内元素个数,此时新节点为栈顶元素右子节点。(7)

    新节点入栈。(8)

最后若栈内元素 > 1,弹出至只剩一个(剩下的为根节点)(9)。返回即可。(10)

通过实例帮助理解:

刷题笔记——栈(C++)_学习笔记_05

刷题笔记——栈(C++)_C++_06

刷题笔记——栈(C++)_学习笔记_07

代码实现

class Solution {
public:
    TreeNode* recoverFromPreorder(string s) {
        stack<TreeNode*> stk;
        int p = 0;	
        // (1)
        while (p < s.size()) {
            int depth = 0;
            // (3)
            while (s[p] == '-') {
                ++depth;
                ++p;
            }
            // (2)
            int val = 0;
            while (p < s.size() && s[p] != '-') {
                val = val * 10 + (s[p] - '0');
                ++p;
            }
            // (4)
            TreeNode* node = new TreeNode(val);
            // (5)
            if (depth == stk.size()) {
                if (!stk.empty()) {
                    stk.top()->left = node;
                }
            }
            // (6)
            else {
                while (depth < stk.size()) {
                    stk.pop();
                }
                // (7)
                stk.top()->right = node;
            }
            // (8)
            stk.push(node);
        }
        // (9)
        while (stk.size() > 1) {
            stk.pop();
        }
        return stk.top(); (10)
    }
};

下边两道题在之前已有详细解释:

刷题笔记——栈(C)_进击no猪排的技术博客_51CTO博客

以下是C++版实现:

LCR 039. 柱状图中最大的矩形 - 力扣(LeetCode)

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int n = heights.size();
        vector<int> ans(n+2, 0);
        for(int i = 0; i < n; i++){
            ans[i+1] = heights[i];
        }
        vector<int> stk(n+2, 0);
        int top = -1;
        stk[++top] = 0;
        int maxArea = 0;
        for(int i = 1; i < (n+2); i++){
            while(ans[i] < ans[stk[top]]){
                maxArea = max(maxArea,(i-stk[top-1]-1)*ans[stk[top]]);
                --top;
            }
            stk[++top] = i;
        }
        return maxArea;   
    }
};

42. 接雨水 - 力扣(LeetCode)

class Solution {
public:
    int trap(vector<int>& height) {
        int n = height.size();
        if(n < 3){
            return 0;
        }
        stack<int> stk;
        stk.push(0);
        int ans = 0;
        for(int i = 1; i < n; i++){
            while(!stk.empty() && height[i] > height[stk.top()]){
                int mid = stk.top();
                stk.pop();
                if(!stk.empty()){
                    int left = stk.top();
                    int h = min(height[left],height[i]) - height[mid];
                    int w = i - left - 1;
                    ans += h * w; 
                }
            }
            stk.push(i);
        }
        return ans;
    }
};

标签:int,top,笔记,stk,++,while,C++,节点,刷题
From: https://blog.51cto.com/goku0623/9151913

相关文章

  • openGauss学习笔记-189 openGauss 数据库运维-常见故障定位案例-TPCC-WAL-内存
    openGauss学习笔记-189openGauss数据库运维-常见故障定位案例-TPCC-WAL-内存189.1TPCC运行时,注入磁盘满故障,TPCC卡住的问题189.1.1问题现象TPCC运行时,注入磁盘满故障,TPCC卡住,故障消除后,TPCC自动续跑。189.1.2原因分析数据库本身机制,在性能日志(gs_profile)所在磁盘满时,导致......
  • openGauss学习笔记-190 openGauss 数据库运维-常见故障定位案例-服务启动失败
    openGauss学习笔记-190openGauss数据库运维-常见故障定位案例-服务启动失败190.1服务启动失败190.1.1问题现象服务启动失败。190.1.2原因分析配置参数不合理,数据库因系统资源不足,或者配置参数不满足内部约束,启动失败。由于部分数据节点状态不正常,导致数据库启动失败。......
  • Linux shell编程学习笔记38:history命令
    目录0 前言1 history命令的功能、格式和退出状态1.1 history命令的功能1.2 history命令的格式1.3退出状态2 命令应用实例2.1 history:显示命令历史列表2.2history-a:将当前会话的命令行历史追加到历史文件~/.bash_history中2.3history-c:删除所有条目从而清空历史列表2.4 ......
  • 【动态规划】【字符串】C++算法:正则表达式匹配
    作者推荐视频算法专题涉及知识点动态规划字符串LeetCode10:正则表达式匹配给你一个字符串s和一个字符规律p,请你来实现一个支持‘.’和‘’的正则表达式匹配。‘.’匹配任意单个字符'’匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符......
  • 【C++】STL 容器 - STL 容器的值语意 ( 容器存储任意类型元素原理 | STL 容器元素可拷
    文章目录一、STL容器的值(Value)语意1、STL容器存储任意类型元素原理2、STL容器元素可拷贝原理3、STL容器元素类型需要满足的要求4、STL容器迭代器遍历二、代码示例-自定义可存放入STL容器的元素类1、代码示例2、执行结果一、STL容器的值(Value)语意1、STL......
  • 【错误记录】C++ 字符串常量参数报错 ( 无法将参数 1 从“const char [4]”转换为“ch
    文章目录一、报错信息二、问题分析三、解决方案1、设置VisualStudio的兼容规则2、修改实参类型①3、修改实参类型②4、修改实参类型③5、修改形参类型一、报错信息定义了一个函数,接收char*类型的字符串参数;//接收字符串参数并打印voidfun(char*str){ cout<......
  • 【C++】STL 算法 ② ( foreach 循环中传入 函数对象 / Lambda 表达式处理元素 | forea
    文章目录一、foreach循环中传入函数对象/Lambda表达式处理元素1、foreach循环算法2、foreach循环中传入函数对象处理元素3、foreach循环中传入Lambda表达式处理元素4、Lambda表达式-匿名函数对象/仿函数一、foreach循环中传入函数对象/Lambda表达式处理......
  • 【C++】STL 容器 - map 关联容器 ④ ( map 容器常用 api 操作 | 查找指定元素 | 获取
    文章目录一、查找指定元素-std::map#find()函数1、函数原型简介2、代码示例二、获取元素个数-std::map#count()函数1、函数原型简介2、代码示例三、获取大于等于指定键的元素-std::map#lower_bound函数1、函数原型简介2、代码示例四、获取大于指定键的元素-std::map#up......
  • find 命令笔记
    find命令作用根据预设条件递归查询文件,当查询一个文件时他会将目录下所有的文件包括子目录全部查询一遍,就算找到了对应文件也不会停止会一直查询到所有文件都查过为止。命令格式-find[目标][条件][-a|-o][条件2]#-a(并且)-o(或者)常见的条件:-type类型......
  • oracle 9i&10g编程艺术-读书笔记2
    配置Statspack安装Statspack需要用internal身份登陆,或者拥有SYSDBA(connect/assysdba)权限的用户登陆。需要在本地安装或者通过telnet登陆到服务器。selectinstance_name,host_name,version,startup_timefromv$instance;检查数据文件路径及磁盘空间,以决定创建数据文件的位置:......