Given a string containing just the characters '('
, ')'
, '{'
, '}'
, '['
and ']'
, determine if the input string is valid.
The brackets must close in the correct order, "()"
and "()[]{}"
are all valid but "(]"
and "([)]"
are not.
其实要求的形式就是与stack的存储方式相对应。如果对应的左边的括号先进栈,那么右边的反括号就要后出现,也就是左边的括号后被pop出来与反括号对应。所以这道题用stack把所有遇到的左边的括号push进stack,然后每遇到一个反括号,就用stack的top访问栈顶存进temp变量里面,再pop删除栈顶(这里特别注意,stack的pop只能删除栈顶,不会返回栈顶的值),看看这两个括号是否匹配。最后就是如果顺括号的数量比反括号多,那么stack最后没有被pop完,这时候就不是valid的。
我的代码:
bool isValid(string s) {
int i = 0;
stack<char> s1;
if (s.length() % 2 != 0)
return false;
while(s[i] != '\0'){
if(s[i] == '{' || s[i] == '[' || s[i] == '('){
char t = s[i];
s1.push(t);
i++;
}
else{
if (s1.empty())
return false;
else{
char temp = s1.top();
s1.pop();
if((s[i] == '}' && temp == '{') || (s[i] == ']' && temp == '[') || (s[i] == ')' && temp == '(') )
i++;
else
return false;
}
}
}
if(s[i] == '\0' && s1.empty())
return true;
else
return false;
}