代码随想录算法训练营第十一天|20. 有效的括号、1047. 删除字符串中的所有相邻重复项、150. 逆波兰表达式求值

news2024/9/21 6:07:06

今天的题目都是对栈的经典应用。

有效的括号

题目链接:力扣

解题思路:基于栈结构的特殊性,其非常适合做对称匹配类问题,其实如果知道了要用栈解这道题,在脑中模拟一遍,接下来的思路就是自然而然能够想到的
这题这里还包含了一个剪枝的条件:若括号都是匹配的,则该字符串定为偶数,若字符串长度为奇数,则一定不匹配。

下面附上我的题解:

class Solution {
public:
    bool isValid(string s) {

        if(s.size() % 2 != 0)     //剪枝
        return false;

        stack<char> Mystack;
        for(int i=0 ; i<s.size(); i++)
        {
            if(s[i] == '(' || s[i] == '{' || s[i] == '[')   //此时执行入栈操作
             Mystack.push(s[i]);
            else                                            //此时执行出栈操作
            {
                if(Mystack.empty())  return false;          //若栈为空,则直接退出
                if((Mystack.top() == '(' && s[i] == ')')
                ||(Mystack.top() == '[' && s[i] == ']') 
                ||(Mystack.top() == '{' && s[i] == '}') )    //此时看栈顶元素和该元素是否是一对
                  Mystack.pop();                            //一致,执行pop
                else                                        //不一致,则退出
                  return false;
            }
        }
        return Mystack.empty();
    }
};

卡哥的给出的答案运用了一点小技巧, 他在匹配左括号的时候,用右括号入栈,就只需要比较当前元素和栈顶相不相等就可以了,这样写的代码更加简洁。 如下所示:

class Solution {
public:
    bool isValid(string s) {
        if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求
        stack<char> st;
        for (int i = 0; i < s.size(); i++) {
            if (s[i] == '(') st.push(')');
            else if (s[i] == '{') st.push('}');
            else if (s[i] == '[') st.push(']');
            // 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false
            // 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return false
            else if (st.empty() || st.top() != s[i]) return false;
            else st.pop(); // st.top() 与 s[i]相等,栈弹出元素
        }
        // 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return true
        return st.empty();
    }
};

删除字符串中的所有相邻重复项

题目链接:力扣

解题思路:其实这题和上题很像,上题的实质是删除相邻括号,即匹配左右括号。这题是删除相邻的重复字符,像这种消除相邻匹配的题,用栈就很合适。
这题也是如果知道用栈来辅助解题,则思路是自然而然的
若栈顶不等于要加入的元素,则加入元素;
若栈顶等于要加入的元素,则将栈顶pop掉 ;
最后栈中留下了的元素便可以组成最终不带相邻重复项的字符串

贴上我的代码:

class Solution {
public:
    string removeDuplicates(string s) {

        stack<char> Mystack;
        string res="";
        for(int i = 0; i<s.size();i++)
        {
            if(Mystack.empty() || Mystack.top() != s[i] )
                 Mystack.push(s[i]);
             else
                 Mystack.pop();
        }
        
        int size = Mystack.size();
        for(int i=0;i<size;i++)
        {
            res = Mystack.top() + res;
            Mystack.pop();
        }
         return res;
    }
};

 卡哥的想法大体上无差,但是他直接利用string来代替stack,这样可以省去栈转为字符串的操作。

class Solution {
public:
    string removeDuplicates(string S) {
        string result;
        for(char s : S) {
            if(result.empty() || result.back() != s) {
                result.push_back(s);
            }
            else {
                result.pop_back();
            }
        }
        return result;
    }
};

逆波兰表达式求值

题目链接:力扣

解题思路 :刚拿到题目的时候有点懵,看不懂题目在说啥,直到看到leetcode上有下述文字,才恍然大悟。

其实最后一句话已经点名了本题的解题思路:
适合用栈操作运算:遇到数字则入栈;遇到算符则取出栈顶两个数字进行计算,并将结果压入栈中
如此以来,代码很好想了

下面贴上我的代码(卡哥的想法与我的类似,就不贴了。
但是在卡哥的代码中,string转long long int 用到了一个C++11的字符串函数stoll()
即stoll(tokens[i]),我第一次见到这个函数,在此记录一下):

class Solution {
public:
    int evalRPN(vector<string>& tokens) {

        stack<int> Mystack;

        for(int i=0 ; i<tokens.size() ; i++)
        {
            if (tokens[i] != "+" && tokens[i] != "-" &&     //若是数字则压栈
            tokens[i] != "*" && tokens[i] != "/")
            {
                int temp = atoi(tokens[i].c_str());
                Mystack.push(temp);
            }
            else                                           //如果是运算符,则取栈中前两个值,进行运算
            {
                int num1 = Mystack.top();
                Mystack.pop();
                int num2 = Mystack.top();
                Mystack.pop();
                int res = 0;

                if(tokens[i] == "+")
                 res = num2 + num1;
                else if(tokens[i] == "-")
                 res = num2 - num1;
                else if(tokens[i] == "*")
                 res = num2 * num1;
                else if(tokens[i] == "/")
                 res = num2 / num1;
                
                Mystack.push(res);                     //将答案压回栈中
            }
            
        }

        return Mystack.top();

    }
};

ps:虽然我们习惯采用中缀表达式(4 + 13 / 5)但计算机采用中缀表达式时不但要比较优先级,还需要做回退操作。
后缀表达式(["4", "13", "5", "/", "+"]) 可以使计算机用栈来顺序处理,不用考虑计算的优先级,这对计算机是非常友好的。这道题展现了计算机的思考方式。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32 多路ADC同时扫描采样

背景 在项目实际应用中&#xff0c;刚好有需求需要使用多路ADC同时采样&#xff0c;这里就选择STM32 ADC多路ADC同时采样&#xff0c;这里简单说明下配置过程&#xff0c;以及使用步骤 原理图 如下图所示&#xff0c;使用四路ADC输入 ADC_Voltage -> 电压信号的采样&…

如何查看linux分区挂载在哪个目录?

一&#xff0c;简介 在linux系统中&#xff0c;如何查看磁盘分区是挂载在哪个目录呢&#xff1f;今天介绍一种方法&#xff0c;供参考。 二&#xff0c;图形化界面查看分区挂载方法 2.1 打开disk工具 2.2 点击查看对应的分区 看一个分区&#xff1a; 如上图所示&#xff0…

百度地图网页设计

一、百度地图api 1、百度搜索——百度地图API 进入——开放平台——开发文档——JavaScript API JavaScript API 首先是GL版本&#xff0c;是三维的效果&#xff0c;我们一般使用二维&#xff0c;选择下面v3.0版本 2、开发指南——注册账号 跟着提示来申请密钥就可。 二、…

Linux基本指令【下】

目录 一、时间相关指令 date显示 时间戳 二、cal指令 三、find指令 &#xff08;重要&#xff09;-name 四、grep指令 五、zip\unzip指令 六、tar指令&#xff1a;打包/解压&#xff0c;不打开它&#xff0c;直接看内容 七、bc指令 八、uname -r指令 九、几个重要…

ConstrainLayout(约束布局)属性详解

layout_constraintLeft_toLeftOf layout_constraintRight_toRightOf 这两个基本上用不上因为 layout_constraintStart_toStartOf就相当于layout_constraintLeft_toLeftOf layout_constraintEnd_toEndOf就相当于layout_constraintRight_toRightOf app:layout_constraintBottom_t…

【VMware】Ubantu 22.04配置静态IP

文章目录 一、VMware 虚拟网络配置VMnet8 网络设置注意 关于取消勾选使用本地DHCP服务将IP地址分配给虚拟机VMnet8 NAT设置 网关IP 二、虚拟机 网络适配器三、启动虚拟机 配置网络查看网卡名设置静态IP Reference 一、VMware 虚拟网络配置 VMnet8 网络设置 子网IP子网掩码 编…

22 外部排序

外部排序 外部排序的基本内容 前面介绍过的排序方法都是在内存中进行的&#xff08;称为内部排序&#xff09;。外部排序是一种无法全部装入内存的大规模数据集的排序算法。与在内存中处理数据的内部排序相比&#xff0c;外部排序要复杂的多&#xff0c;主要因为是其需要解决…

【c语言】二进制文件的读写操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

1.1 IAR新建工作空间 及 新建工程

目录 新建工作空间 新建工程 新建工作空间 &#xff08;1&#xff09;创建一个名字为Workspace的文件夹&#xff0c;如图所示。 &#xff08;2&#xff09;运行IAR EW for 8051 10.10.1&#xff0c;如图所示。 &#xff08;3&#xff09;依次选择File和New Workspace&#xf…

【IDEA使用指南】如何将 IDEA 开发工具作为可视化工具来操作数据库?

如何将 IDEA 开发工具作为可视化工具来操作数据库&#xff1f; 步骤1&#xff1a;找到数据源配置的工具栏。 如下图所示&#xff0c;找到 “View -> Tool Windows -> Database”&#xff0c;点击“Database”。 步骤2&#xff1a;选择数据源类型。 在开发工具右侧会…

CSS背景色渐变

从上到下渐变&#xff1a;background: linear-gradient(red, pink); 从左到右渐变&#xff1a;background: linear-gradient(to right, red , pink); 对角&#xff08;从左上角到右下角&#xff09;渐变&#xff1a;background: linear-gradient(to bottom right, red , pink);…

【Linux】进程信号详解(三)

文章目录 一、可重入函数二、volatile三、SIGCHLD信号 一、可重入函数 假设有一个不带头的单链表&#xff0c;要进行头插操作&#xff0c;在我们数据结构阶段都已经学习过&#xff0c;我们可以有以下的步骤&#xff1a; 要将node1头插到单链表中&#xff0c;调用insert函数&…

什么是数据仓库

数据仓库的概念可以追溯到20世纪80年代&#xff0c;当时IBM的研究人员开发出了“商业数据仓库”。本质上&#xff0c;数据仓库试图提供一种从操作型系统到决策支持环境的数据流架构模型。数据仓库概念的提出&#xff0c;是为了解决与这个数据流相关的各种问题&#xff0c;主要是…

flutter 在动图上添加文字

前言 有这样一个场景&#xff0c;在一个展示很多文字的App中背景图片可以自定义&#xff0c;当然也可以是动态的&#xff0c;但是这个主页是可以分享出去的&#xff0c;也就是我需要在一个动态的背景上写上文字并保存为一张新的图片并分享出去。 实现 前置准备 需要导入一个…

【计算机视觉 | 目标检测】Objects365 :最新大规模高质量目标检测数据集

文章目录 一、前言二、数据集的规模三、数据集的质量四、泛化能力五、结语 一、前言 2019 年 4 月&#xff0c;在北京举行的智源学者计划启动暨联合实验室发布会上&#xff0c;北京旷视科技有限公司与北京智源人工智能研究院共同发布了全球最大的目标检测数据集 &#xff1a; …

ChatGPT国内免费访问

背景 ChatGPT作为一种基于人工智能技术的自然语言处理工具&#xff0c;近期的热度直接沸腾&#x1f30b;。 作为一个程序员&#xff0c;我也忍不住做了一个基于ChatGPT的网站&#xff0c;免费&#xff01;免梯子&#xff01;&#xff01;国内可直接对话ChatGPT&#xff0c;也…

使用Python和Scrapy实现抓取网站数据

Scrapy是一个功能强大的网络爬虫框架&#xff0c;允许开发者轻松地抓取和解析网站内容&#xff0c;这篇文章主要为大家介绍了如何使用Python的Scrapy库进行网站数据抓取&#xff0c;需要的可以参考一下 在本文中&#xff0c;我们将介绍如何使用Python的Scrapy库进行网站数据抓…

00后才是内卷界的扛把子,被卷的头皮发麻....

人们都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;前一周时间我们公司来了个00年的&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪20K&#xff0c;都快接近我了。后来听同事说才知道人家是个卷王&#xff0c;从早干到晚就差搬张床…

哈希表应用——布隆过滤器

注&#xff1a;布隆过滤是用来处理海量数据且允许存在误判 目录 布隆过滤器提出 布隆过滤器概念 布隆过滤器的理论知识 布隆过滤器的实现 布隆过滤器的删除 布隆过滤器优点 布隆过滤器缺陷 布隆过滤器的应用场景 哈希切分 布隆过滤器/哈希切分面试题 布隆过滤器提出 …

免交互Here Document

文章目录 免交互Here Document1 定义2 语法格式2.1 免交互方式实现对行数的统计2.2 通过 read 命令接收输入并打印2.3 通过 passwd 给用户设置密码2.4 支持变量替换2.5 多行注释 3 expect4 实例4.1 su切换用户4.2 嵌入执行模式4.3 实现ssh自动登录 免交互Here Document 1 定义…