题目要求
整体思路
创建一个存放字符的栈
接着遍历字符串:
当遇到左括号时就将其push进栈中
当遇到右括号时,首先检查栈是否为空。如果不为空则再检查栈的顶部元素是否为与该右括号匹配的左括号。如果匹配,将栈顶元素弹出。
最后检查栈是否为空:
为空返回true
不为空返回false
代码
class Solution {
public:
bool isValid(string s)
{
std::stack<char> stackChar;
for (auto i : s)
{
//左括号入栈
if (i == '(' || i == '{' || i == '[')
{
stackChar.push(i);
}
//右括号查看栈顶是否匹配,如果匹配就将栈顶元素出栈
else
{
if (i == ')')
{
if (stackChar.empty() || stackChar.top() != '(')
return false;
stackChar.pop();
}
else if (i == '}')
{
if (stackChar.empty() || stackChar.top() != '{')
return false;
stackChar.pop();
}
else
{
if (stackChar.empty() || stackChar.top() != '[')
return false;
stackChar.pop();
}
}
}
//符号栈为空,才返回true
if (stackChar.empty())
{
return true;
}
return false;
}
};
学到了什么
1、别因为脑子一热就把&&和||写反了
if (i == '(' || i == '{' || i == '[')
这里弄错了一次,所以导致逻辑错误
2、边界判断:在查看栈顶元素时,首先需要确认栈不为空
if (stackChar.empty() || stackChar.top() != '(')
判断是否为空的语句写在前面,这样可以利用逻辑短路跳过访问空栈顶的语句
这里漏判栈是否为空,导致通不过编译
3、回想起了以前写词法分析器时碰到过类似的匹配问题
c语言的跨行注释也是这种匹配问题