题目:Valid Parentheses
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.
题目分析:
- 本题的含义是配对三种标点符号
- 需要考虑到各种情况:
- 正好配对例如“{[]}”
- “{{} ” 这种情况出栈之后结果的栈不为空 因为多余了反大花括号
- “{}}” 这种情况是前两个配对好后栈为空,但是还剩余需要判断出栈,可是栈里面没有元素了,所以这种情况需要加判断栈是否为空 特别注意
- 不能正确配对“{{[}”
思路:
- 分析题目可得使用栈来解决此题非常方便
- 如果出现符号的前一半,都入栈
- 如果出现符号的后一半,先检查栈是否为空,若为空,直接返回false;若不为空,检查栈顶元素是否可以配对,如果可以配对,那么继续;如果不可以配对,返回false
- 字符串结束之后,判断栈是否为空,若不为空返回false;若为空,返回true
代码:
- C++:【错误代码】
class Solution {
public:
bool isValid(string s)
{
stack<char> Schar;
int i=0;
while(i<s.length())
{
char a=s[i];
if(a=='(' || a=='{' || a=='[')//如果是这三种符号那么入栈
{
Schar.push(a);
}
else
{
char t=Schar.top();//获取栈顶元素
switch(a)
{
case ')'://如果输入的元素时反括号
if(t=='(')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
case '}':
if(t=='{')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
case ']':
if(t=='[')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
}
}
++i;
}
if(Schar.size()!=0)
{
return false;
}
else
{
return true;
}
}
};
//注释:如果出现例如"]"或者"{}]"类似这种情况,就无法正确判断
- C++:【正确解法】
class Solution {
public:
bool isValid(string s)
{
stack<char> Schar;
int i=0;
while(i<s.length())
{
char a=s[i];
if(a=='(' || a=='{' || a=='[')//如果是这三种符号那么入栈
{
Schar.push(a);
}
else
{
if(Schar.size()==0)//这一句不能少,这一句的含义是例如这种情况出现:"{[()]}}"前面已经有三对配对,但是最后还剩余一个单独的反花括号,这种情况需要考虑到
{
return false;
}
char t=Schar.top();//获取栈顶元素
switch(a)
{
case ')'://如果输入的元素时反括号
if(t=='(')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
case '}':
if(t=='{')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
case ']':
if(t=='[')//如果栈顶元素时正括号
{
Schar.pop();//将栈顶的正括号出栈
break;
}
else//如果栈顶元素不是正括号 那么返回false
{
return false;
}
}
}
++i;
}
if(Schar.size()==0)
{
return true;
}
else//这句话是考虑到如果出现如下情况"{{[()]}" 这样最后配对完还剩余一个前花括号 也应该返回false
{
return false;
}
}
};