判断代码中,左右括号是否匹配,例如:
1.char a[]="(())abc{[(])}";//左右括号次序匹配不正确
2.char b[]="(()))abc{[]}";//右括号多于左括号
3.char c[]="(()()abc{[]}";//左括号多于右括号
4.char d[]="(())abc{[]()}";//左右括号匹配正确
思路分析:
我们如何判断左右括号是否匹配,这时候我们想到了栈,遇到左括号是压栈;遇到有括号时,判断栈内是否有元素,如果栈空,则右括号多,比较栈顶元素是否和当前有括号匹配,如果匹配出栈,如果不匹配,则左右括号不匹配;如果栈内还有元素,则左括号多,如果栈内没有元素了,则匹配。
代码如下:
void MatchBrackets(const char *str)
{
Stack Stack;
StackInit(&Stack);
char *p = str;
char *t = 0;
while (*p != '\0')
{
switch (*p)
{
case '{':
case '[':
case '(':
StackPush(&Stack, *p);//如果是左括号,统一入栈
break;
case '}':
case ']':
case ')':
if (IsEmpty(&Stack))//如果是右括号先判断栈内是否为空
{
printf("右括号多于左括号\n");//如果为空则右括号多
return;
}
t = StackTop(&Stack);//如果不为空判断栈顶元素和*p是否匹配
if (t == '{'&&*p == '}' || t == '['&&*p == ']' || t == '('&&*p == ')')
{
StackPop(&Stack); break;//如果匹配出栈
}
else
{
printf("左右括号不匹配\n");//不匹配
return;
}
default:
break;
}
p++;
}
if (IsEmpty(&Stack))//最后判断栈内是否还有元素
{
printf("左右括号匹配\n"); return;//如果没有,左右括号匹配
}
else { printf("左括号多于右括号\n"); return; }//如果有,左括号多
}