给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
class Solution
{
public:
bool isValid(string s)
{
//创建栈
stack<char> st;
//遍历字符串
for (int i = 0; i < s.size(); i++)
{
//如果栈为空,则将字符放入栈中
if (st.empty())
{
st.push(s[i]);
continue;//不执行下面的语句
}
//字符变量top存放栈顶的字符
//和字符串中的下一个字符一同判断括号是否是有效的
char top = st.top();
if (s[i] == ')' && top == '(')
{
//如果栈顶的字符和下一个字符对应则使栈顶元素出栈
st.pop();
continue;
}
else if (s[i] == ']' && top == '[')
{
st.pop();
continue;
}
else if (s[i] == '}' && top == '{')
{
st.pop();
continue;
}
//如果以上三个if都没有执行则将字符放入栈中
st.push(s[i]);
}
//如果遍历完字符串栈为空则说明所有括号一一对应,判定有效
return st.empty();//如果栈为空返回
}
};
通过例子更好理解
如
输入: "{[()]}"
遍历字符串
①第一个字符'{',此时栈为空,则将'{'放入栈中
{ |
②第二个字符'[',此时栈顶元素为'{'与'['并不对应,则将'['放入栈中
[ |
{ |
③第三个字符为'(',栈顶元素为'['与'('不对应,放入栈中
( |
[ |
{ |
④第四个元素为')',栈顶元素为'('与')'对应,则栈顶元素'('出栈
[ |
{ |
⑤第五个元素为']',栈顶元素为'['与']'对应,栈顶元素出栈
{ |
⑥第六个元素为'}',栈顶元素为'{'与'}'对应,栈顶元素出栈
遍历完毕,此时栈为空,所以返回true