代码随想录算法训练营DAY11|C++栈和队列Part.2|LeetCode:20.有效的括号、 1047.删除字符串中所有相邻重复项、150.逆波兰表达式

文章目录

  • 20.有效的括号
    • 思路
    • CPP代码
  • 1047.删除字符串中所有相邻重复项
    • 思路
    • CPP代码
  • 150.逆波兰表达式
    • 思路
      • 什么是逆波兰表达式
      • 本题的思路
    • CPP代码

20.有效的括号

力扣题目链接

文章链接:20.有效的括号

视频链接:LeetCode:20. 有效的括号

状态:思路其实很容易想到,把当前时刻括号的右括号入栈,等碰到对应了右括号就出栈。到后面栈内只要剩元素,那肯定就不是有效括号了。还有一个很重要的就是要判断有哪些不匹配的情况,这样才能把判断逻辑写完整。

思路

正如上文对思路的确定,很重要的就是弄清楚字符串里的括号不匹配有哪几种情况

  • 第一种情况,字符串左方向括号多余,所以不做匹配;
    在这里插入图片描述

  • 第二种情况,括号没有多余,但是括号的类型没有匹配上;
    在这里插入图片描述

  • 第三种情况,字符串里右方向的括号多余了,所以不匹配。

在这里插入图片描述

对上述三种情况,基于把当前时刻括号的右括号入栈,等碰到对应了右括号就出栈的规则,判断条件分别如下:

第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false

for (int i = 0; i < s.size(); i++){//遍历字符串
  //字符串遍历语法
}	
return false

第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false

if (st.top() != s[i]) return false

第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false

if (st.empty()) return false;

CPP代码

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();
    }
};

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

力扣题目链接

文章链接:1047.删除字符串中所有相邻重复项

视频链接:栈的好戏还要继续!| LeetCode:1047. 删除字符串中的所有相邻重复项

状态:其实我觉得这道题最难的点就在于想到用栈。用栈的话,不妨拿纸笔画一下,马上就能知道如何去做代码实现。

思路

只要我们把字符串中的元素一个个入栈,空栈的时候直接放入元素,如果碰到我们想入栈的元素和栈顶元素一致,那就直接消除就好了;不一致我们就把它推入栈。这样我们就实现了既要删除重复元素,还要对字符串S反复执行重复项的删除工作。

CPP代码

class Solution {
public:
    string removeDuplicates(string S) {
        stack<char> st;
        for (char s : S) {
            if (st.empty() || s != st.top()) {
                st.push(s);
            } else {
                st.pop(); // s 与 st.top()相等的情况
            }
        }
        string result = "";
        while (!st.empty()) { // 将栈中元素放到result字符串汇总
            result += st.top();
            st.pop();
        }
        reverse (result.begin(), result.end()); // 此时字符串需要反转一下
        return result;

    }
};

150.逆波兰表达式

力扣题目链接

文章链接:150.逆波兰表达式

视频链接:栈的最后表演! | LeetCode:150. 逆波兰表达式求值

状态:逆波兰表达式,典型的栈的应用

思路

什么是逆波兰表达式

逆波兰表达式其实就是一种后缀表达式。把运算符作为中间结点,画出二叉树,然后这个二叉树的后序遍历就是这个数学式子的逆波兰表达式

对于计算机而言,后缀表达式是很方便计算机来进行计算的。

本题的思路

既然本题已经给出了后缀表达式,那么我们如何实现计算呢?答案就是先把后缀表达式依次入栈,碰到数学符号就进行计算。然后把计算结果继续入栈,再碰到数学符号又进行计算。直到遍历完整个后缀表达式,最终栈内肯定只剩下一个元素,这个元素就是我们的最终结果

CPP代码

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        // 力扣修改了后台测试数据,需要用longlong
        stack<long long> st; 
        for (int i = 0; i < tokens.size(); i++) {
            if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/") {
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
                if (tokens[i] == "+") st.push(num2 + num1);
                if (tokens[i] == "-") st.push(num2 - num1);
                if (tokens[i] == "*") st.push(num2 * num1);
                if (tokens[i] == "/") st.push(num2 / num1);
            } else {
                st.push(stoll(tokens[i]));
            }
        }

        int result = st.top();
        st.pop(); // 把栈里最后一个元素弹出(其实不弹出也没事)
        return result;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Github profile Readme实现小游戏[github自述游戏]

Github profile Readme常用于个人主页介绍&#xff0c;将它与action自动化流程结合&#xff0c;可以实现一些小游戏 例如&#xff1a;2048、五子棋 2048实现 losehu (RUBO) GitHub 五子棋 https://github.com/losehu/losehu/tree/main 通过python/C编写可执行文件&#xf…

搜索与图论——Prim算法求最小生成树

在最小生成树问题里&#xff0c;正边和负边都没问题 朴素版prim算法 时间复杂度O(n^2) 生成树&#xff1a;每一次选中的t点&#xff0c;它和集合的距离对应的那条边&#xff0c;就是生成树的一条边 算法流程和dijkstra算法非常相似 #include<iostream> #include<cs…

浏览器工作原理与实践--栈空间和堆空间:数据是如何存储的

对于前端开发者来说&#xff0c;JavaScript的内存机制是一个不被经常提及的概念 &#xff0c;因此很容易被忽视。特别是一些非计算机专业的同学&#xff0c;对内存机制可能没有非常清晰的认识&#xff0c;甚至有些同学根本就不知道JavaScript的内存机制是什么。 但是如果你想成…

039—pandas 不规则表头转换为规整DataFrame

使用步骤 读入数据 代码如下&#xff08;示例&#xff09;&#xff1a; import pandas as pd import numpy as np df pd.DataFrame({0: [姓名, 性别],1: [张三, 男],2: [年龄,np.nan],3: [18,np.nan]}) dfdf.values.reshape([4,2])r len(df.columns)(pd.DataFrame(df.valu…

全国产数据采集卡定制,24位八通道以太网数据采集卡 labview 100K采样

XM702是一款以太网型高速数据采集卡&#xff0c;具有8通 道真差分输入&#xff0c;24位分辨率&#xff0c;单通道最高采样率100ksps八通 道同步共计800ksps、精密前置增益放大、集成IEPE/ICP硬件 支持的特点。本产品采用了多个高精度24位ADC单元及配合本 公司多年积累开发的前置…

24.WEB渗透测试-BurpSuite关于app抓包

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;23.WEB渗透测试-BurpSuite&#xff08;二&#xff09; 方法一&#xff1a;使用模拟器&am…

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测

时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现OOA-BP鱼鹰算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

工作常用设计模式

设计模式分类 创建者模式&#xff08;5种&#xff09; 单例模式原型模式工厂方法模式抽象工厂模式建造者模式 结构型模式&#xff08;7种&#xff09; 代理模式适配器模式桥接模式装饰者模式外观模式享元模式组合模式 行为型模式&#xff08;11种&#xff09; 模板方法模…

qdrant

文章目录 一、关于 qdrantFeaturesFiltering and PayloadHybrid Search with Sparse Vectors Vector Quantization and On-Disk StorageDistributed DeploymentHighlighted Features Integrations 二、快速上手1、下载和运行安装 qdrant-clientdocker 2、初始化 client3、创建 …

在.Net6中用gdal实现第一个功能

目录 一、创建.NET6的控制台应用程序 二、加载Gdal插件 三、编写程序 一、创建.NET6的控制台应用程序 二、加载Gdal插件 Gdal的资源可以经过NuGet包引入。右键单击项目名称&#xff0c;然后选择 "Manage NuGet Packages"&#xff08;管理 NuGet 包&#xff09;。N…

用docker搭建的Vulfocus镜像管理界面不能同步解决办法

之前拉取的Vulfocus镜像同步功能失效&#xff0c;最简单的解决办法就是换一个能同步的版本 # 修改镜像源 sudo mkdir -p /etc/dockersudo tee /etc/docker/daemon.json <<-EOF {"registry-mirrors": ["https://dockerproxy.com/"] } EOFsudo syste…

EasyDarwin 、ffmpeg 音视频推流拉流;OBS视频推理软件、obs-rtspserver服务器

参考&#xff1a;https://blog.csdn.net/N71FS1/article/details/130019563 一、EasyDarwin ffmpeg ffmpeg 推送音视频流到rtsp流服务器 EasyDarwin 作为rtsp流服务器 &#xff08;下载&#xff1a;https://www.easydarwin.org/p/easydarwin.html&#xff09;OBS 直播音视频录…

N9010A安捷伦N9010A信号分析仪

181/2461/8938产品概述&#xff1a; Keysight N9010A EXA 信号分析仪是最大限度提高生产线吞吐量的最快方法。从测量速度到代码兼容性&#xff0c;它让每一毫秒都很重要&#xff0c;并帮助您降低总体测试成本。 我们无法预测未来&#xff0c;但安捷伦可以利用我们面向未来的测…

test7

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

Hive on Spark 配置

目录 1 Hive 引擎简介2 Hive on Spark 配置2.1 在 Hive 所在节点部署 Spark2.2 在hive中创建spark配置文件2.3 向 HDFS上传Spark纯净版 jar 包2.4 修改hive-site.xml文件2.5 Hive on Spark测试2.6 报错 1 Hive 引擎简介 Hive引擎包括&#xff1a;MR&#xff08;默认&#xff09…

bert 适合 embedding 的模型

目录 背景 embedding 求最相似的 topk 结果查看 背景 想要求两个文本的相似度&#xff0c;就单纯相似度&#xff0c;不要语义相似度&#xff0c;直接使用 bert 先 embedding 然后找出相似的文本&#xff0c;效果都不太好&#xff0c;试过 bert-base-chinese&#xff0c;be…

浪潮信息极致存储 助力垦丰破解种子密码

近几年&#xff0c;我国育种行业迈向数字化转型新阶段&#xff0c;以北大荒垦丰种业为代表的育种企业&#xff0c;正持续通过前沿技术赋能&#xff0c;打造研发创新体系&#xff0c;为中国育种行业的高质量发展贡献力量。值得一提的是&#xff0c;在应对存储问题期间&#xff0…

Linux ssh免密登录配置

步骤 在本地机器上生成公钥和私钥对。将本地公钥复制到远程机器的~/.ssh/authorized_keys文件中。 实现1 在服务器上生成SSH密钥对 ssh-keygen -t rsa -f /home/id_rsa1ssh-keygen: 这是一个用于生成、管理和转换 SSH 密钥的 OpenSSH 工具。-t rsa: 用于指定要生成的密钥类…

Centos安装部署

Centos安装部署 linux安装JDK 下载地址&#xff1a;https://www.oracle.com/java/technologies/oracle-java-archive-downloads.html 创建文件夹&#xff0c;输入命令&#xff1a; mkdir /usr/local/jdk 查看JDK信息&#xff0c;输入命令&#xff1a; java -version 将下载的…

无尘布的多重应用:保持洁净,细致无遗

在现代社会中&#xff0c;随着科技的不断进步和人们对卫生环境要求的提高&#xff0c;无尘布作为一种多功能的擦拭材料&#xff0c;正被广泛应用于各种需要高洁净度环境的领域。其多重应用不仅为电子行业、医疗行业、生物工程和光学仪器等专业领域提供了便利&#xff0c;同时也…