有四种情况
- 左右括号匹配,如:({}[])
- 左括号多出,如:([())
- 右括号多出,如:(()])
- 括号顺序不匹配,如:[(])
用栈实现思路如下
- 当遇到左括号的时候入栈
- 当遇到右括号的时候,与栈顶的左括号匹配,栈顶左括号出栈;若不匹配,则匹配失败
- 若栈以空,还有未匹配的右括号,说明右括号多出,匹配失败
- 括号匹配完成后,若栈未空,说明左括号多出,匹配失败
- 以上情况都未出现,匹配成功
代码如下
#include<stdio.h>
#define STACKMAX 100
#define STACKADD 10
int StackEmpty(SqStack* S);
char GetTop(SqStack* S);
int Push(SqStack* S,char e);
int PopStack(SqStack* S);
int StackEmpty(SqStack* S)
{
if(S->base == S->top)
return 1;
return 0;
}
char GetTop(SqStack* S)
{
if(StackEmpty(S))
return 0;
return *(S->top-1);
}
int Push(SqStack* S,datatype e)
{
if(S->top - S->base >= S->stacksize)
{
S->base = (datatype*)realloc(S->base,
(S->stacksize+STACKADD)*sizeof(datatype));
if(!S->base)
return 0;
S->top = S->base + S->stacksize;
S->stacksize += STACKADD;
}
*S->top++ = e;
return 1;
}
int PopStack(SqStack* S)
{
if(StackEmpty(S))
return 0;
--S->top;
return 1;
}
int CheckBraceStack(char *str)
{
SqStack S;
int i,flag,len;
len = strlen(str);
flag = 1;
InitStack(&S);
for(i=0; i<len; i++)
{
if(str[i]=='(' || str[i]=='{' || str[i]=='[')
Push(&S,str[i]);
else if(str[i] == ')')
{
if(GetTop(&S) == '(')
PopStack(&S);
else
flag = 0;
}
else if(str[i] == '}')
{
if(GetTop(&S) == '{')
PopStack(&S);
else
flag = 0;
}
else if(str[i] == ']')
{
if(GetTop(&S) == '[')
PopStack(&S);
else
flag = 0;
}
}
if(!StackEmpty(&S))
flag = 0;
return flag;
}
int main()
{
char str[10086];
printf("Enter brackets:");
scanf("%s",str);
if(CheckBraceBreak(str))
printf("ok\n");
else
printf("bu ok\n");
return 0;
}
测试结果如下
