括号匹配问题
首先要清楚括号的使用规则:
出现左括号,必有相应的右括号与之匹配,并且每对括号之间可以嵌套,但不能出现交叉情况。由此,在算法中设置一个栈,每读入一个括号,若是左括号,则直接入栈,等待相匹配的同类右括号;若读入的是右括号,且与当前栈顶的左括号同类型,则二者匹配,将栈顶的左括号出栈,否则属于不合法的情况。此外,输入序列已读完,而栈中仍有等待匹配的左括号,或者读入了一个右括号,而栈中已无等待匹配的左括号,均属不合法的情况。当输入序列和栈同时变为空时,说明所有括号完全匹配。
主函数代码如下
int main()
{
SqStack s;
ElemType str[100],e;
int length,i=0;
InitStack(&s);//初始化栈
gets(str);
length = strlen(str);
while(i<length)
{
switch(str[i])
{
case '[':
case '(':
case '{': Push(&s,str[i]);break;//左括号入栈
case ']':
case ')':
case '}':
if(isEmptyStack(s)==true)
{
printf("栈为空了,右括号多余\n");
return;
}
else
{
GetTop(s,&e);//取出栈中栈顶元素
if(Match(e,str[i])==true)//判断左右括号匹配
{
Pop(&s,&e);//左括号出栈
}
else
{
printf("匹配失败,左右括号不同\n");
return;
}
}
break;
}
i++;
}
if(isEmptyStack(s)==true)//判断栈是否为空
{
printf("全部匹配成功\n");
}
else
{
printf("匹配失败,左括号多余\n");
}
return 0;
}