给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
例如: 输入:s = "()" 输出:true
输入:s = "()[]{}" 输出:true
首先,字符串中的括号不匹配有以下几种情况
1、字符串中左方向括号多余,所以不匹配
2、括号没有多余,但是类型不匹配
3、字符串中右方向多余,所以不匹配
栈和队列是STL中的数据结构,容器适配器。
栈是先进后出,队列是先进先出
class Solution
{
public:
bool isvaild(string s)
{
if (s.size() % 2 != 0)return false;
stack<char>st;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')st.push(')');
else if (s[i] == '{')st.push('}');
else if (s[i] == '[')st.push(']');
else if (st.empty() || st.top() != s[i])return false; //栈里没有我们要匹配的字符,返回false
else st.pop(); //st.top==s[i],栈弹出元素
}
//遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配
return st.empty();
}
};
第一种情况:遍历了所有的字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,return false
第二种情况:如果在字符串匹配的过程中,发现栈里没有我们要匹配的字符
第三种情况:遍历字符串的过程中,栈已经为空了,没有匹配的字符,说明右边库哟好没有对应的左边括号