①思路
栈经常用于括号匹配等问题
1.动画演示工作流程(代码实现的就是这个流程)
有效的括号
2.整体思路
1.遇到左括号入栈
2.遇到右括号进行匹配
匹配成功则弹栈。失败返回false
3.遇到无效字符
返回false
4.遍历结束判断栈是否为空
空:匹配成功
非空:残留左括号,匹配未成功
②代码实现
class Solution {
public:
//判断是否为:左括号
bool isLeft(char a){
return a=='('||a=='['||a=='{';
}
bool isValid(string s) {
if(s.size()%2==1)return false;//剪枝操作,如果操作符的数量是奇数,一定无法匹配
stack<char>store;
for(auto &ss:s){
if(isLeft(ss)){
store.push(ss);
}
else{//匹配到右括号 or 无效字符
//剪枝操作
if(store.empty())return false;//如果没有左括号给予匹配。肯定是匹配失败
//1.右括号
if(ss==')'){
if(store.top()!='(')return false;
store.pop();
}
//2.右括号
else if(ss==']'){
if(store.top()!='[')return false;
store.pop();
}
//3.右括号
else if(ss=='}'){
if(store.top()!='{')return false;
store.pop();
}
//无效字符(非右括号)
else{
return false;//不是有效右括号
}
}
}
//栈内左括号剩余,括号匹配不完全
if(!store.empty()){
return false;
}
return true;
}
};