20.有效的括号
给出一个只含有括号的字符串,找出里面是否有不成对的括号。
class Solution {
public:
bool isValid(string s) {
if(s.size() < 2 || s[0] == ')' || s[0] == ']' || s[0] == ')')
{
return false;
}
stack<char> st;//栈用来存放所有的左括号。
bool result = false;//返回结果
for(int i = 0;i < s.size();i++)
{
if(s[i] == '(' || s[i] == '[' || s[i] == '{')
{
st.push(s[i]);
}
//判断当前的字符是否与栈顶的元素成一对。
else if(!st.empty() &&
((s[i] == ')' && st.top()== '(') || (s[i] == ']' && st.top()== '[') ||
(s[i] == '}' && st.top()== '{')))
{
st.pop();
result = true;
}
else
{
result = false;
break;
}
}
//若栈中还有元素存在,则说明有不成对的括号。
if(!st.empty())
{
result = false;
}
return result;
}
};
思路:使用栈来存储所有的左括号,当碰到右括号时,先判断栈中是否存有数据,没有代表有不成对的括号,否则与栈顶元素对比是否是一对括号(因为括号是成对出现,左括号在表达式中出现的越晚,则右括号出现的约早,栈的特性使得栈顶元素一直是当前最晚出现的左括号)。最后判断栈是否为空,不为空则代表栈中存在没有匹配右括号的左括号。