class Solution {
public:
bool isValid(string s) {
stack<char> a;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '{' || s[i] == '['){
a.push(s[i]);
}
else{
switch (s[i]){
case ')':
if(a.top() == '('){
a.pop();
}
else{
return false;
}
break;
case '}':
if(a.top() == '{'){
a.pop();
}
else{
return false;
}
break;
case ']':
if(a.top() == '['){
a.pop();
}
else{
return false;
}
break;
}
}
}
return true;
}
};自己的错误写法
上边错误的原因就是没有对输入考虑全面,那就是如果根本没有右括号,上边的这个玩意也是返回的true,因为他根本不会进入switch语句中,不会遇到false。
所以最后能从for循环出来并不代表他就能匹配,需要栈为空才行。
梅开二度,你还是没有考虑到一个点就是只有右括号没有左括号呢???
那就会导致你在判断的时候访问空栈,也就是必须在栈不为空的情况下你才能去考虑取出栈顶然后看匹配与否:
class Solution {
public:
bool isValid(string s) {
stack<char> a;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(' || s[i] == '{' || s[i] == '['){
a.push(s[i]);
}
else{
switch (s[i]){
case ')':
if(a.size() != 0 && a.top() == '('){
a.pop();
}
else{
return false;
}
break;
case '}':
if(a.size() != 0 && a.top() == '{'){
a.pop();
}
else{
return false;
}
break;
case ']':
if(a.size() != 0 && a.top() == '['){
a.pop();
}
else{
return false;
}
break;
}
}
}
if(a.size() == 0)
return true;
else return false;
}
};