解题思路
通过栈来处理字符。
- 创建一个
char
类型的栈。 - 将传入的字符串
s
进行逐字节遍历,因为情景条件固定三种,所以使用switch
语句。
如果是{}
、()
、[]
中的左括号就通过push()
入栈。 - 如果是右括号,就进行比较。
1)如果为此时空栈empty()
,说明没有与右括号匹配的左括号,右括号个数多于左括号个数,一定不会匹配成功,此时直接返回false
。
2)如果不是空栈,取出栈顶元素与当前右括号匹配。
如果成功匹配,就让栈顶元素弹出pop()
,否则没有成功匹配返回失败false
。 - 最后
switch
语句执行完毕,所有的左括号已全部入栈,所有的右括号无论成败都已全部匹配完毕。若此时栈内仍有元素,即不为空栈,说明左括号过多,直接返回false
。 - 如果前面的逻辑都执行完毕,没有返回失败,说明此时所有括号均已匹配成功,可以返回
true
。
代码实现
class Solution {
public:
bool isValid(string s) {
stack<char> st;
int size = s.size();
for(int i = 0;i < size;i++){
char ch = s[i];
switch(ch){
case '(':
case '[':
case '{':
//入栈
st.push(ch);
break;
case ')':
case ']':
case '}':
{
if(st.empty()){
//右括号多
return false;
}
char left = st.top();
if((left == '(' && ch == ')')
|| (left == '[' && ch == ']')
|| (left == '{' && ch == '}')){
//匹配,即出栈
st.pop();
}
else{
return false;
}
}
}
}
if(!st.empty()){
//左括号多
return false;
}
return true;
}
};