力扣20.有效的括号

题目链接
这个学过数据结构栈的应用的基本上都会
就是把字符串进栈,如果是左边的括号,无脑入栈,
如果是右边的括号,那得看栈顶是不是和它匹配,如果匹配的话,一起出栈,如果不匹配,就先入栈

一直到遍历完整个字符串后

如果最后栈为空,那么就是有效
不为空说明有匹配不上的就是无效

但是我这个思路怎么说,有错误,这错误还是chatgpt给我改出来的,是由我这个代码实现的语法造成的,就是如果一开始没有左半部分(,[,{,那么栈是空的,

**当栈为空时,直接调用 one.top() 会引发异常,**因为你试图访问一个空栈的顶部元素。为了避免这个问题,你需要在尝试访问栈顶元素之前检查栈是否为空。’

至于为什么会发生异常,简单了解一下。
标准库规定,在这种情况下调用 top() 方法的行为是未定义的(Undefined Behavior, UB)。在实际实现中,这通常会导致程序崩溃或引发异常,因为尝试访问一个不存在的元素违反了栈的基本契约。

class Solution {
public:bool isValid(string s) {stack<char> one;//为了加快程序的速度if(s.size()%2!=0)return false;//这句可有可无。for(int i=0;i<s.size();i++){if(s[i]=='('||s[i]=='{'||s[i]=='[')one.push(s[i]);else if (one.empty()) return false; // 添加对空栈的检查if(s[i]==')'){if(one.top()=='(') one.pop();else one.push(s[i]);}else if(s[i]=='}'){if(one.top()=='{') one.pop();else one.push(s[i]);}else if(s[i]==']'){if(one.top()=='[') one.pop();else one.push(s[i]);}}return one.empty();}
};

这个题可以让我总结出一个常用套路来,遇到函数是字符串 string 类型
该怎么做
就当成普通的函数数组来处理

如何对这个题的题意更加读懂:

在给定的字符串 ([([]])) 中,虽然每种类型的左括号都有对应的右括号,但是它们的闭合顺序不正确。这个字符串不满足“有效字符串”的定义,因为左括号的闭合顺序违反了有效字符串的第二个和第三个条件:

所以遇到右括号都会去看栈顶元素是否匹配。

这道题代码随想路的思路是建议先把这个失配的各种情况给了解一下,讨论出来再用代码实现

但是她的的代码思路其实和我的遇到左括号就入栈其实一回事,我是匹配的话出栈,它则是“相等”则出栈

我后来对自己的代码进行了一个优化,就是当遍历字符串遍历到右括号的时候,如果栈顶元素和这个右括号不匹配,那么就说明失配了,我之前的写法是不考虑匹配顺序的,
但是我的那个写法其是必须只能满足要求顺序匹配的,否则就是错的,否则不按顺序直接统计每类括号的个数看是否一一对应即可

class Solution {
public:bool isValid(string s) {stack<char> one;//为了加快程序的速度if(s.size()%2!=0)return false;//这句可有可无。for(int i=0;i<s.size();i++){if(s[i]=='('||s[i]=='{'||s[i]=='[')one.push(s[i]);else if (one.empty()) return false; // 添加对空栈的检查if(s[i]==')'){if(one.top()=='(') one.pop();else return false;}else if(s[i]=='}'){if(one.top()=='{') one.pop();else return false;}else if(s[i]==']'){if(one.top()=='[') one.pop();else return false;}}return one.empty();}
};

用这个 switch case 来实现

class Solution {
public:bool isValid(string s) {stack<char> one;//为了加快程序的速度if(s.size()%2!=0)return false;//这句可有可无。for(int i=0;i<s.size();i++){switch(s[i]){case '(':case '{':case '[':one.push(s[i]);break;case ')':if(one.empty()||one.top()!='(') return false;else one.pop();break;case '}':if(one.empty()||one.top()!='{') return false;else one.pop();break;case ']':if(one.empty()||one.top()!='[') return false;else one.pop();break;}}return one.empty();}
};
class Solution {
public:bool isValid(string s) {stack<char> one;//为了加快程序的速度if(s.size()%2!=0)return false;//这句可有可无。for(int i=0;i<s.size();i++){switch(s[i]){case '(':case '{':case '[':one.push(s[i]);break;if (one.empty()) return false; case ')':if(one.top()=='(') one.pop();else return false;break;case '}':if(one.top()=='{') one.pop();else return false;break;case ']':if(one.top()=='[') one.pop();else return false;break;}}return one.empty();}
};
//if 语句不能直接放在 switch 语句的 case 标签内部而不归属于任何 case。这样的 if 语句应该放在具体的 case 分支内,或者是在 switch 语句之前或之后。

关于这个力扣的代码,自己主要是不会map这个STL 的使用,嘿嘿嘿嘿
https://www.mubu.com/doc/1Qqu2K7mrH-
自己记得笔记,想看的看看

class Solution {
public:bool isValid(string s) {stack<char> one;//为了加快程序的速度if(s.size()%2!=0)return false;//这句可有可无。unordered_map<char,char>pairs={{')','('},{']','['},{'}','{'}};for(int i=0;i<s.size();i++){if(pairs.count(s[i])){if(one.empty()||one.top()!=pairs[s[i]])return false;else one.pop();}else one.push(s[i]);}return one.empty();}
};

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

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

相关文章

R语言【raster】——rasterize():栅格化点、线、面

Package raster version 3.6-27 Description 将与“对象”类型空间数据(点、线、多边形)相关的值转移到栅格单元。 对于多边形&#xff0c;如果多边形覆盖栅格单元的中心&#xff0c;则传输值。对于行&#xff0c;将值传输到与行接触的所有单元格。您可以通过先将多边形光栅化…

九、线性代数二-向量组的概念

目录 1、向量组的概念&#xff1a; 2、向量组线性组合的概念&#xff1a; 3、向量组的线性组合的矩阵表示&#xff1a; 4、向量组的线性组合的方程组表示&#xff1a; 1、向量组的概念&#xff1a; 理解&#xff1a; 矩阵是一个特殊的向量组。 2、向量组线性组合的概念&…

软考40-上午题-【数据库】-关系代数运算2-专门的集合运算

一、专门的集合运算 1、投影 示例&#xff1a; 可以用属性名进行投影&#xff0c;也可以用列的序号进行投影。 2、选择 例题 1、笛卡尔积 2、投影 3、选择 3、连接 第一步都要算&#xff1a;笛卡尔积。 3-1、θ连接 示例&#xff1a; 3-2、等值连接 示例&#xff1a; 3-3、自…

嵌入式ARM LINUX实战开发-linux常用指令

链接&#xff1a;https://pan.baidu.com/s/1KTnzt19pzOE2Uwvp7d4E-w?pwd1688 提取码&#xff1a;1688 (1) ls&#xff08;list&#xff0c;列表&#xff09; 作用&#xff1a;使用列表把当前文件夹下所有文件显示出来 ls -a 显示所有文件&#xff0c;包括隐藏文件 ls …

如何准确查询自己的大数据信用报告?

在当今数字化时代&#xff0c;大数据信用报告在个人信用评估中扮演着越来越重要的角色。然而&#xff0c;很多人可能不知道如何查询自己的大数据信用报告。本文贷大家一起了解一下&#xff0c;希望对你有帮助。 如何准确查询自己的大数据信用报告&#xff1a; 一、找到可靠的查…

Python学习 --- 面向对象

1.什么是对象 1.Python中创建类的关键字是 class 2.类的成员方法 1.函数是写在类外面的,方法则是写在类里面的 1.上面这一段代码中就展示了如何在方法中访问类的成员变量: self.成员变量名 3.魔术方法 魔术方法其实就是python中的类中的内置方法,下面这几个只是我们比较常…

Linux应用- RabbitMQ安装

RabbitMQ安装部署【简单】 简介 RabbitMQ一款知名的开源消息队列系统&#xff0c;为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见&#xff0c;为大家演示快速搭建RabbitMQ环境。 安装 rabbitmq在yum仓库中的版本比较老&#xff0c;所以…

Git基本操作(1)

Git基本操作&#xff08;1&#xff09; 初始化git本地仓库git本地仓库配置git config user.name 和git config user.emailgit config --unset user.name和git config --unset user.emailgit config --global 认识工作区&#xff0c;暂存区&#xff0c;版本库更深层次理解 git a…

做qt界面样式,写代码,好用的搜索工具,我推荐ai伙伴

ai伙伴 这里有最全的官方qss样式&#xff0c;但还是有点不全 有些qt样式要配合csdn来搜

Java学习26--枚举类

enum枚举 Java 枚举是一个特殊的类&#xff0c;一般表示一组常量&#xff0c;比如一年的 4 个季节&#xff0c;一年的 12 个月份&#xff0c;一个星期的 7 天&#xff0c;方向有东南西北等。 Java 枚举类使用 enum 关键字来定义&#xff0c;各个常量使用逗号 , 来分割。 enu…

微服务Day6

文章目录 DSL查询文档RestClient查询文档快速入门 旅游案例 DSL查询文档 RestClient查询文档 快速入门 Testvoid testMatchAll() throws IOException {//1.准备RequestSearchRequest request new SearchRequest("hotel");//2.准备DSLrequest.source().query(QueryB…

海外媒体推广通过5个发稿平台开拓国际市场-华媒舍

随着全球化的进程&#xff0c;国际市场对于企业的吸引力日益增加。进入国际市场并获得成功并非易事。海外媒体推广发稿平台成为了一种重要的营销手段&#xff0c;能够帮助企业在国际市场中建立品牌形象、传递信息和吸引目标受众。本文介绍了五个海外媒体推广发稿平台&#xff0…

Linux系统安装部署RabbitMQ详细教程(图文详解)

前言:在分布式系统中进行消息传递和通信时,可能会用到RabbitMQ,这边我写一篇简易的部署教程,带大家了解一下,只要跟着文章一步步走就可以部署成功了,其中的坑博主都替大家踩过了。 博主的其他部署教程: 1、Docker部署前后端分离项目:手把手通过Docker部署前后端分离项目…

Linux:gcc的基本知识

gcc 是一个将C语言文件变成可执行文件的工具。 在Linux中&#xff0c;如果需要将一个C语言文件变得可以执行&#xff0c;那么除了这个文件本身的内容是C语言编写的内容外&#xff0c;还需要gcc这个编译工具进行编译才行。 gcc 使用的格式方法:gcc 要编译的文件 //在该代码下…

【软件架构】05-高性能架构

1、缓存 设计思路&#xff1a; 1.什么数据应该缓存 2.什么时机触发缓存和以及触发方式是什么 3.缓存的层次和粒度&#xff08; 网关缓存如 nginx&#xff0c;本地缓存如单机文件&#xff0c;分布式缓存如redis cluster&#xff0c;进程内缓存如全局变量&#xff09; 1&#…

Flink checkpoint操作流程详解与报错调试方法汇总,增量checkpoint原理及版本更新变化,作业恢复和扩缩容原理与优化

Flink checkpoint操作流程详解与报错调试方法汇总&#xff0c;增量checkpoint原理及版本更新变化&#xff0c;作业恢复和扩缩容原理与优化 flink checkpint出错类型flink 重启策略Checkpint 流程简介增量Checkpoint实现原理MemoryStateBackend 原理FsStateBackend原理RocksDBSt…

Javascript 运算符、流程控制语句和数组

【三】运算符 【1】算数运算符 &#xff08;1&#xff09;分类 加减乘除&#xff1a;*/取余&#xff1a;%和python不一样的点&#xff1a;没有取整// &#xff08;2&#xff09;特殊的点 只要NaN参与运算得到的结果也是NaNnull转换成0&#xff0c;undefined转换成NaN 【2…

oauth2基本概念

1.什么是oauth2 OAuth2.0介绍 OAuth(Open Authorization)是一个关于授权(authorization)的开放网络标准,允许用户授权第三方 应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他 们数据的所有内容。OAuth在全世界得到广泛应…

信息系统项目管理师(高项)—学习笔记

第一章信息化发展 1.1 信息与信息化 1.1.1 信息 信息是物质、能量及其属性的标示的集合&#xff0c;是确定性的增加。 它以物质介质为载体&#xff0c;在传递和反映世界各种事物存在方式、运动状态等的表征。 信息不是物质&#xff0c;也不是能力&#xff0c;它以一种普遍…