题目
解决思路
第一次做这个题目时肯定是没有思路的,也不会想栈的方向去想,但当你有了一定经验以后,你会发现它比配时有些符合栈的特点,它后进先出的特点正好可以帮助我们完成这一题:
利用栈的特点,我们遇到数组中的左括号就入栈,直到此时它遇到第一个右括号,那么出栈顶的数据,此时不正是出的距离刚刚那个右括号离的最近的括号吗,如果比配的话,就继续迭代下去。
代码实现
至于这个代码里面栈的实现,就不放在这篇博客里了,不熟练的可以去看看博主之前的博客。
bool isValid(char * s)
{
struct Stack c;
Stackinit(&c);
char a[][2]={{'(',')'},{'{','}'},{'[',']'}};
while(*s)
{
int i=0;
for(i=0;i<3;i++)
{
if(*s==a[i][0])
{
//为左括号,则入栈
StackPush(&c,*s);
++s;
break;
}
}
//此时不是左括号了,而是既左括号后第一个出现右括号的位置
if(i==3)
{
if(StackEmpty(&c)==1)
{
return false;
}
char top=Stacktake(&c);
int j=0;
for(j=0;j<3;j++)
{
//为了找出*s和哪个右括号相等
if(*s==a[j][1])
{
//看栈顶的括号是不是对应的左括号
if(top==a[j][0])
{
StackPop(&c);
++s;
break;
}
else
{
return false;
}
}
}
}
//如果遍历玩了s后,此时栈里面为空了,则说明完全匹配了,否则不完全匹配
}
//如果遍历玩了s后,此时栈里面为空了,则说明完全匹配了,否则不完全匹配
if (StackEmpty(&c) == 1)
return true;
else
return false;
}