给定一个只包括 '(',')','{','}','[',']' 的字符串s ,判断字符串是否有效。每个右括号都有一个对应的相同类型的左括号,左括号必须以正确的顺序闭合,左括号必须以相同类型的右括号闭合。
对于这种括号匹配问题,就可以使用到栈来完成,我们可以遍历这个字符串s,将其中所有左括号压栈,其中右括号就与对应左括号匹配并将该左括号出栈,以此重复进行,直到栈内为空NULL或者遍历到\0结束。
由于我们需要用到栈,因此需要写入栈的实现。栈的实现过后,我们才正式开始完成括号匹配问题。
在字符串遍历过程中,遇到左侧三种括号,压栈:
if ((*s == '{') || (*s == '[') || (*s == '('))
{
AStackPush(&as, *s);
}
遇到右侧三种括号,先判断栈是否为空,为空说明这个字符串s是从右括号开始的,不符合括号匹配,直接返回false:
if (AStackEmpty(&as))
{
AStackDestroy(&as);
return false;
}
栈不为空时,我们获取栈顶元素放入tmp变量中,使用if条件判断,当tmp为左括号而*s不是对应的右括号时,那么销毁栈并返回false:
char top = AStackTop(&as);
AStackPop(&as);
if ((*s == ')' && top != '(')
|| (*s == ']' && top != '[')
|| (*s == '}' && top != '{'))
{
AStackDestroy(&as);
return false;
}
那么整体循环如下:
while (*s)
{
if ((*s == '{') || (*s == '[') || (*s == '('))
{
AStackPush(&as, *s);
}
else
{
if (AStackEmpty(&as))
{
AStackDestroy(&as);
return false;
}
char top = AStackTop(&as);
AStackPop(&as);
if ((*s == ')' && top != '(')
|| (*s == ']' && top != '[')
|| (*s == '}' && top != '{'))
{
AStackDestroy(&as);
return false;
}
}
s++;
}
最后出循环后,如果栈为空,那么说明左右括号全部匹配,返回true,否则返回false:
bool ret = AStackEmpty(&as);
AStackDestroy(&as);
return ret;
整体代码如下:
bool isValid(char* s)
{
AS as;
AStackInit(&as);
while (*s)
{
if ((*s == '{') || (*s == '[') || (*s == '('))
{
AStackPush(&as, *s);
}
else
{
if (AStackEmpty(&as))
{
AStackDestroy(&as);
return false;
}
char top = AStackTop(&as);
AStackPop(&as);
if ((*s == ')' && top != '(')
|| (*s == ']' && top != '[')
|| (*s == '}' && top != '{'))
{
AStackDestroy(&as);
return false;
}
}
s++;
}
bool ret = AStackEmpty(&as);
AStackDestroy(&as);
return ret;