有效括号。括号匹配题。
思想:用栈实现。思考不匹配的情况有哪些:
1).数量不匹配,如果字符数量为奇数,那么一定不匹配。
2).数量匹配的情况下,不匹配情况:"{[)}"、"))"、"(("。
ps:
1.不要直接看完题就开始写代码,要分析不匹配的情况有哪些,想清楚了再写。(第一次就是直接开写,结果越写越乱)
2.最后return的是st.empty(),非常巧妙,可以应对"(("这种情况。
3.注意st.empty() || st.top() != s[i],两个的顺序不能调换,必须先判断st是否为空,如果反过来,先 判断st.top() != s[i],st为空时会报错
代码:
class Solution {
public:
bool isValid(string s) {
stack<char> st;
if (s == "")
return true;
int n = s.size();
if (n % 2 != 0) //([]数量不符
return false;
for (int i = 0;i < s.size();i++) {
if (s[i] == '{')
st.push('}');
else if (s[i] == '[')
st.push(']');
else if (s[i] == '(')
st.push(')');
//"{[)}" "()))" 数量符合,不匹配
else if (st.empty() || st.top() != s[i])
return false;
else st.pop();
}
return st.empty();
}
};
附一个第一次写的垃圾代码(会报错,因为最后没有return,中间已经绕晕了,最后都不知道怎么return了):
class Solution {
public:
bool isValid(string s) {
stack<char> st;
// string s = "([]}";
if (s == "") {
cout << "true" << endl;
return true;
}
for (int i = 0;i < s.size();i++) {
cout << s[i] << endl;
if (s[i] == '{')
st.push('}');
else if (s[i] == '[')
st.push(']');
else if (s[i] == '(')
st.push(')');
else {
if (st.empty()) {
cout << "false" << endl;
return false;
}
if (st.top() != s[i]) {
cout << "false" << endl;
return false;
}
else {
st.pop();
if (st.empty() && i == s.size() - 1) {
cout << "true" << endl;
return true;
}
if (!st.empty() && i == s.size() - 1) {
cout << "false" << endl;
return false;
}
}
}
}
}
};