原题链接:
本题是很经典的一道栈的入门题,我们可以从反面考虑什么情况不符合要求,大致分为以下三种情况:
1.左右括号数量不匹配;
2.不同括号相互交错;
3.左右括号的位置不对;
我们考虑用栈来储存三种左括号,每一次如果出现的是左括号就入栈,当出现右括号且与栈顶的左括号匹配时就看作匹配成功,将栈顶元素弹出;
如果栈顶元素与右括号不匹配或者是出现右括号时栈为空时,可以直接判断匹配失败,并直接标记(此时出现了不同括号相互交错或者是先出现右括号而没有左括号的问题)。
当最后栈为空且没有被标记时,可以认为匹配成功。
代码如下:
class Solution {
public:
bool isValid(string s) {
char stack[10001] = {' '};
int a = 0,len = s.length(),jud = 0; // jud 用于标记
bool c = true;
for(int i = 0;i < len;i++)
{
if(s[i] == '(')
{
stack[++a] = '(';
}
else if(s[i] == '{'){
stack[++a] = '{';
}
else if(s[i] == '['){
stack[++a] = '[';
}
else if(s[i] == ')'){
if(stack[a] == '(')
a--;
else
jud = 2; // 已经出现了不可能匹配的情况,直接标记
}
else if(s[i] == '}'){
if(stack[a] == '{')
a--;
else
jud = 2;
}
else if(s[i] == ']'){
if(stack[a] == '[')
a--;
else
jud = 2;
}
}
if(a == 0 && jud != 2)
c = true;
else
c = false;
return c;
}
};