题目链接
这个学过数据结构栈的应用的基本上都会
就是把字符串进栈,如果是左边的括号,无脑入栈,
如果是右边的括号,那得看栈顶是不是和它匹配,如果匹配的话,一起出栈,如果不匹配,就先入栈
一直到遍历完整个字符串后
如果最后栈为空,那么就是有效
不为空说明有匹配不上的就是无效
但是我这个思路怎么说,有错误,这错误还是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();}
};