题目链接:
题目描述:
Given a string containing just the characters ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ and ‘]’, determine if the input string is valid.
The brackets must close in the correct order, “()” and “()[]{}” are all valid but “(]” and “([)]” are not.
题目解释:
给定一个字符串,这个字符串只包含’(‘,’)’,’[‘,’]’,’{‘,’}’这六个字符,判断输入的字符串是否有效,在这里所谓的有效是指字符串中的括号字符要有一个正确的顺序,比如“( )”,”()[]”,“{}”这样子的顺序是正确的,但是像“(]”,”({)}”则是错误的
解题方案:
这个题目像不像逆波兰表达式?括号必须成对存在,就像我们平时写的表达式一样,”()”之间的子字符串肯定是成对括号,例如”({}[])”,同理 “[]”,”{}”也之间是相同的情况。括号字符满足先进后出的规则。
那么我们用一个栈来存储”(“,”[“,”{“,当遇到”)”时,栈顶元素一定是”)”,否则这个字符串就是无效的,同理”]”,”}”也是相同的处理规则。
代码
class Solution {
public:
bool isValid(string s)
{
stack<char> st;
for (int i = 0; i < s.length(); ++i)
{
if(s[i] == '(' || s[i] == '{' || s[i] == '[')
{
st.push(s[i]);
}
else
{
if(s[i] == ')')
{
if(!st.empty() && st.top() == '(')
{
st.pop();
}
else
{
return false;
}
}
if(s[i] == ']')
{
if(!st.empty() && st.top() == '[')
{
st.pop();
}
else
{
return false;
}
}
if(s[i] == '}')
{
if(!st.empty() && st.top() == '{')
{
st.pop();
}
else
{
return false;
}
}
}
}
if(st.empty())
{
return true;
}
else
{
return false;
}
}
};