(写给未来遗忘的自己)(实习论文都ok了,接下来猛猛刷题)
题目:
代码:
class Solution {
public:
bool isValid(string s) {
std::stack<char> s_stack;
// 直接判断空字符串也是有效的情况
if (s.size() % 2 != 0) return false;
// 将 i 初始化为 0
for (int i = 0; i < s.size(); i++) {
if (s[i] == '(') {
s_stack.push(')');
} else if (s[i] == '[') {
s_stack.push(']');
} else if (s[i] == '{') {
s_stack.push('}');
} else {
// 判断栈是否为空
if (s_stack.empty() || s[i] != s_stack.top()) {
return false;
}
s_stack.pop();
}
}
return s_stack.empty();
}
};
第一次写出错的地方:
if (s_stack.empty() || s[i] != s_stack.top()) {
return false;
}
s_stack.pop();
正确的写法是在匹配成功就是弹出了(意味着栈不是空的)。
但是匹配不成功分为两种情况:1.栈为空没有了。2.符号不对应。
思路:
对于符号来说,是呈现一个左右对称的。所以就是:正确的括号分别下将所有的左括号和右括号分开是一一对应的。从左往右走的左括号,对应从右往左走的右括号。所以利用栈的先进后出特性正好处理。
所以碰到左括号就在栈中保存相同类型的右括号,碰到右括号就检查是否和栈的top一致,判断是否正确。
知识点:
栈是先进后出的机制,所以适合于处理左右匹配类型的题目。