题目
栈:有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([])”
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
代码
class Solution {
public:
bool isValid(string s) {
stack<char> st;
for(auto& ch:s)
{
if(ch=='('||ch=='('||ch=='['||ch=='{')//若字符是([{时直接入栈
{
st.push(ch);
}
else if(!st.empty()&&isMatch(st.top(),ch))//否则,若栈不为空并且栈顶元素与该字符是一对时栈顶元素出栈
{
st.pop();
}else
{
return false;//否则不匹配或者栈空直接返回false
}
}
if(st.empty())//循环结束后若栈为空说明都有匹配则返回true
{
return true;
}
else{
return false;
}
}
bool isMatch(char& left,char& right)//比较两个字符是否是一对的函数
{
if(left=='('&&right==')')
{
return true;
}else if(left=='['&&right==']')
{
return true;
}else if(left=='{'&&right=='}'){
return true;
}else{
return false;
}
}
};
原理图
原理解释
提示:算法流程及解释在代码中已标注
使用栈来操作
示例1:
遇到左括号压栈,遇到右括号与栈顶元素比较,是一对两者都消掉,栈顶元素出栈,后面依次该操作
示例2:
遇到左括号压栈,遇到左括号压栈,遇到左括号压栈,遇到右括号与栈顶元素比较是一对出栈,后面两个也分别比较都符合出栈。
示例3:
左括号压栈,左中括号压栈,右括号与栈顶元素比较不是一对,则直接返回false
结束
原理图借鉴哔站华南溜达虎,如有侵权联系删除。