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

【代码随想录训练营】【Day11】第五章|栈与队列|20. 有效的括号|1047. 删除字符串中的所有相邻重复项|150. 逆波兰表达式求值 阅读详情

LeetCode:20. 有效的括号

先来分析一下 这里有三种不匹配的情况

1.第一种情况,字符串里左方向的括号多余了 ,所以不匹配。在这里插入图片描述
2.第二种情况,括号没有多余,但是 括号的类型没有匹配上
在这里插入图片描述
3.第三种情况,字符串里右方向的括号多余了,所以不匹配。 括号匹配。
在这里插入图片描述
第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false。
第二种情况:遍历字符串匹配的过程中,发现栈里没有要匹配的字符。所以return false。
第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号return false

C++实现:

class Solution {
public:    
bool  isValid(string s){
        stack<char> st;
        //如果字符串的长度为基数肯定不满足
        if (s.size() % 2 != 0)
            return false;
        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('}');
            //出现右括号的情况
            else if(st.empty() || st.top() != s[i])     //1.对应情况2和3    2.st.empty()在前防止空栈出现异常,判断是否为空
                return false;
            else
                st.pop();                               /// 对应情况1
        }
        return st.empty();
    }
};
    

Python实现:

    def isValid(self, s: str) -> bool:
        stack = []
        for item in s:
            if item == '(':
                stack.append(')')
            elif item == '[':
                stack.append(']')
            elif item == '{':
                stack.append('}')
             # 对应情况2和3
            elif not stack or item != stack[-1]:
                return False
             # 对应情况1
            else:
                stack.pop()
        return True if not stack else False

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

本题是匹配相邻元素,最后都是做消除的操作,是用栈来解决的经典题目。

算法示意图
图片来源

C++实现:

可以拿字符串直接作为栈,这样省去了栈还要转为字符串的操作

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

Python实现:

class Solution:
    def removeDuplicates(self, s: str) -> str:
        result = []
        for item in s:
            if not result or result[-1] != item:
                result.append(item)
            else:
                result.pop()
        return "".join(result)

150. 逆波兰表达式求值

先导知识:什么是逆波兰表达式(后面补充)

可能出现连续相乘的,所以使用 long long

C++实现:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        for(string item : tokens){
            if(item == "+" || item == "-" ||item == "*" ||item == "/"){
                long long num1 = st.top();
                st.pop();
                long long num2 = st.top();
                st.pop();
//                注意弹出的顺序
                if(item == "+") st.push(num2 + num1);
                if(item == "-") st.push(num2 - num1);
                if(item == "*") st.push(num2 * num1);
                if(item == "/") st.push(num2 / num1);
            }else {
                st.push(stoll(item));
            }
        }
        long long result = st.top();
        st.pop();
        return result;
    }
};

补充知识:stol和stoll函数

Python实现:

    def evalRPN(self, tokens: List[str]) -> int:
        st = []
        for item in tokens:
            if item not in {"+", "-", "*", "/"}:
                st.append(item)
            else:
                num1, num2 = st.pop(), st.pop()
#  eval( )函数 :可以理解为评估函数(英文eval是评估的意思),一般用于字符串与数字的转换,将字符串转换为可以用于计算的数值。
                st.append(int(eval(f'{num2} {item} {num1}')))
        return int(st.pop())

补充知识eval, f''函数
f’'函数
f’'函数补充
eval函数

《爬虫和逆向教程》 - 专栏介绍和目录 本专栏为爬虫初学者和进阶开发者量身定制的爬虫和逆向学习园地。为你提供全面而深入的爬虫和逆向技术指导,从入门到精通,从基础理论到高级实战,助你在数据的海洋中畅游,挖掘出有价值的信息。通过本专栏的学习,你将具备独立开发和优化爬虫程序的能力,及逆向分析能力和项目开发能力,成为爬虫领域的佼佼者。 阅读详情

相关推荐

例题讲解拉格朗日乘子法、线性可分支持向量机(SVM)的推导

支持向量机(Support Vector Machine, SVM)的简单推导及例题

zzzssszzzzsz的博客 5683

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

代码随想录算法训练营2022_12_17

Jane_10358的博客 203

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

代码随想录-算法训练营day11【栈与队列02:有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值】

代码随想录-算法训练营day11【栈与队列02:有效的括号、删除字符串中的所有相邻重复项、逆波兰表达式求值】

upward 1221

Jetson Orin NX 单目标跟踪算法实战

本文对比了NanoTrack和MixFormerV2两种目标跟踪算法在Jetson Orin NX边缘设备上的实际表现。通过天空小目标跟踪场景测试发现,NanoTrack虽然表征能力较弱,但具有目标身份一致性强、失败模式可控、计算负担小等优势,更适合作为边缘端默认算法。MixFormerV2则适用于高速运动等特定场景。实验数据显示NanoTrack在Orin NX上可达200FPS,远高于MixFormerV2的38-120FPS。建议先采用NanoTrack构建稳定系统,后续再评估复杂算法的适用性。

karmueo46的博客 625

直流无刷BLDC六步换相“电流环”、“速度环”的关系

4、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载非正常变化,例如速度严重“超速”时,需要“限速”保护,这个任务是“速度环”的,这时“速度环”会根据设定的速度上限,控制触发器,将电机速度迅速将下来,电流降下来,在“限速”保护期间,“电流环”失去对触发器的控制作用;3、在电流闭环模式下,电机的电流严格按给定电流运行,负载大小变化时,电流不变,电机速度跟随负载正常变化,“速度环”对速度大小的控制作用是没有的;6、很多人想当然,“电流环”不工作,电机“电流”哪里来的?

u011878611的博客 5472

算法训练营day11(栈和队列02:有效括号,删除字符串相邻重复项,逆波兰表达式求值)

/Deque方法有push(),pop(),peek(),ipush(),pop(),peek(),ipeek(),idEmpty()DequedEmpty()//如果 s 是一个有效的整数字符串(例如 "123", "-456", "0"),则 Integer.valueOf(s) 将成功执行并返回相应的 Integer 对象。if( tokens.equals("+") ){//字符串不能用 == 判断,需要用.equals()方法。//用字符串当栈,top用来当栈顶元素下标,为-1说明栈为空;

weixin_61931006的博客 1041

手把手教你用思岚RPLIDAR C1激光雷达实现简单环境扫描(树莓派4B+Ubuntu22.04)

本文详细介绍了如何在树莓派4B(Ubuntu 22.04系统)上驱动思岚RPLIDAR C1激光雷达,从硬件连接、权限配置、SDK编译到运行示例程序,最终实现环境扫描数据的可视化。通过手把手教程,帮助开发者和爱好者快速上手激光雷达应用,构建简单的环境扫描图。

j2k3l4的博客 1133

代码随想录算法训练营第11天 |(栈与队列2)● 20. 有效的括号 ● 1047. 删除字符串中的所有相邻重复项 ● 150. 逆波兰表达式求值

要知道栈为什么适合做这种类似于爱消除的操作,因为栈帮助我们记录了 遍历数组当前元素时候,前一个元素是什么。大家先自己思考一下 有哪些不匹配的场景,在看视频 我讲的都有哪些场景,落实到代码其实就容易很多了。的底层数据结构是数组,而无边界的形容,那么指明了PriorityQueue是自带扩容机制的。本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题。讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。通常作为栈或队列使用,但是栈的效率不如。实现大小的调整,会是一个很好的选择。

weixin_46743838的博客 1185

Python 爬虫教程:企业官网基本信息抓取

本文介绍了使用Python爬虫技术抓取企业官网信息的方法,包括公司名称、简介、联系方式、地址、产品及新闻等数据。通过Requests和BeautifulSoup库实现网页请求与解析,并利用Pandas存储数据为CSV文件。同时提供了应对反爬虫机制(如设置User-Agent、代理IP池、延迟请求等)的解决方案,帮助高效获取企业公开数据。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1861

AI Agent智能体在Android开发中的应用

本文探讨了AIAgent(智能代理体)在Android开发中的应用,涵盖技术原理、实践案例与未来趋势。AIAgent通过机器学习、自然语言处理等技术实现代码生成、测试自动化及性能优化,显著提升开发效率。例如,强化学习模型可优化APP响应时间(公式:$\text{响应时间}=f(\text{负载},\text{资源})$),自动化测试覆盖率提升至95%。

郑伟强dev的专栏 124

代码随想录算法训练营(JAVA)| 第五章 栈与队列part02

力扣 20.有效的括号 1047.删除字符串中的所有相邻重复项 150.逆波兰表达式求值

like455的博客 780

【yolo】如何在 YOLOv8 中添加负样本以减少误检

在YOLOv8目标检测中,误检(False Positive)是一个常见问题,即模型将非目标区域错误识别为目标。通过引入负样本(Negative Samples),即不包含任何目标框的图像,可以有效减少误检。在YOLOv8中添加负样本的方法是为这些图像提供空的标注文件(.txt),确保每张图像都有对应的标注文件,即使内容为空。可以使用Python脚本自动生成这些空标注文件。使用负样本时需注意数量比例、标注一致性、验证集同步和图像质量。适当加入负样本能显著提升模型鲁棒性,降低误判风险。

songhuangong123的博客 2879

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

题目链接/文章讲解/视频讲解:https://programmercarl.com/0020.%E6%9C%89%E6%95%88%E7%9A%84%E6%8B%AC%E5%8F%B7.html。使用栈的可以另外定义新的返回字符串,因为已经用了O(N)空间的栈,所以空间利用都差不多。【第一想法与实现(困难)】直接实现一个栈,发现需要考虑的边界情况较多,代码稍长,不易理解。本题不难,但第一次做的话,会很难想到,所以先看视频,了解思路再去做题。讲完了栈实现队列,队列实现栈,接下来就是栈的经典应用了。

henry87653的博客 245

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

代码随想录算法训练营day11|Leetcode栈与队列part2

代码随想录@程序员Carl每写一道题我自个儿总结一下,文章肯定还是有不足之处的。

xjx2022_1_12的博客 590

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

海智算法训练营第十一天 | 第五章 栈与队列part02 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 150. 逆波兰表达式求值

题目:有效的括号 这道题主要考察的是对栈的理解,这道题的思路是: 从左到右遍历字符串,遇到是左括号的就将他的右括号放入栈中,遇到右括号就弹出括号,如果弹出的括号匹配不上,那么就是无效的括号。 题目:删除字符串中的所有相邻重复项用字符串模拟栈 题目:逆波兰表达式求值这道题用到了栈的性质,因为后缀表达式的求法是遇到数字就加入栈中,遇到计算符就弹出前两个数进行计算,算出来的结果就再放进栈中,最后栈中的那个数就是答案。这里耍小聪明把一堆if换成了switch,好像并没有美观多少。

qq_74462324的博客 632

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

代码随想录算法训练营第十一天|第五章 栈与队列part01 part02

思路:1.想要保证实现“有效的括号”,那么就要配对,即需要先入后出---->栈2.需要检查什么样的错误:括号得不到匹配(落单);类型匹配不对;括号多余/冗余3.ps:虽然匹配的是相同的类型,但是也存在左右之分,故应该有六种,同时左必先于右。

m0_63021149的博客 553

【代码随想录算法训练营14期】Day11- 第五章 栈与队列part02

题目的思路在考研复习中都做过,主要是一些函数的使用和栈的操作函数熟悉一下。

jtzdgzlm的博客 198

【代码随想录】算法训练营 第十一天 第五章 栈与队列 Part 2

代码随想录算法训练营第十一天打卡!

Summerison的博客 1076

代码随想录训练营day11

本题犯的错误不是大毛病二是把string类型的字符串和char类型的字符搞混了。(2)采用字符串模拟栈功能。(1)直接用栈当容器。

chaizihao111的博客 413

代码随想录算法训练营 day 11 第五章 栈与队列part02

栈,特别擅长处理相邻元素在特定情况的操作。

raymond365的博客 332

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

fast指针遍历,slow指针指向答案的末尾。1047. 删除字符串中的所有相邻重复项。1047. 删除字符串中的所有相邻重复项。除时要用int(num1/num2)今日学习的文章链接,或者视频链接。今日收获,记录一下自己的学习时长。150. 逆波兰表达式求值。自己实现过程中遇到哪些困难。遍历,每次和栈顶元素比较。看完代码随想录之后的想法。注意减和除时取元素的顺序。自己看到题目的第一想法。

taohuaak47的博客 72

代码随想录算法训练营第11天 |第五章 栈与队列part02

遇到左括号,将对应的右括号压入栈,栈中只保存对应的右括号。当指针指到右括号后,判断和栈顶的元素是否匹配,如果在所有右括号都匹配完的时候,栈空,则说明每一个都匹配成功了。

qq_43750923的博客 301

算法训练营Day11 第五章 栈与队列part2

因为stack帮助我们记录了遍历数组当前元素时候,前一个元素是什么,因此stack适合解决这种“爱消除”类的问题。这道题最后需要反转一下字符串,因为stack取出来的字符是反着的。去掉括号后表达式无歧义,上式即便写成 1 2 + 3 4 + * 也可以依据次序计算出正确结果。再进一步看,本题中每一个子表达式要得出一个结果,然后拿这个结果再进行运算,那么。逆波兰表达式指的是一种后缀表达式,所谓后缀就是指运算符写在后面。这道题也可以利用stack来解决,只不过本题不要相邻元素做消除了,而是做运算!

minatozaki98的博客 216

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

今日学习的文章链接,或者视频链接。今日收获,记录一下自己的学习时长。自己实现过程中遇到哪些困难。看完代码随想录之后的想法。自己看到题目的第一想法。

taohuaak47的博客 287

代码随想录算法训练营第十天| 第五章 栈与队列part02

今天的三道题仍然是关于栈与队列,三道题都还算比较常规。

weixin_47613107的博客 279
上一篇: Python判断list是否为空
下一篇: 代码随想录算法训练营第十天,第五章 栈与队列 | 232.用栈实现队列 225. 用队列实现栈
CV-ROBOT
博客等级 码龄9年 47粉丝 32原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值