【题目描述】
如果一个括号序列中的每个左括号都有一个右括号与之完成配对,这个序列就是一个合法的括号匹配序列。
例如:
char a[] = "(())abc{[(])}";//左右括号匹配不正确
char b[] = "(()))abc{[]}";//右括号多于左括号
char c[] = "(()()abc{[]}";//左括号多于右括号
char d[] = "(())abc{[]}";//左右括号匹配正确
请用一种数据结构判断出以上四个不同序列的括号是否匹配。
【思路讲解】
【代码实现】
int MatchBrackets(Stack s, const char* pStr)//括号匹配(if实现)
{
int i = 0;
int len = 0;
DataType e;
if (NULL == pStr)//判断括号表达式是否为空
{
return 0;
}
len = strlen(pStr);//求括号表达式长度
for (i = 0; i <len; ++i)
{
if (!IsBrackets(pStr[i]))//判断 i 位置上的字符是否为括号
{
continue;//不是,继续取下一个字符
}
else//是括号
{
if (('(' == pStr[i]) || ('[' == pStr[i]) || ('{' == pStr[i]))//左括号
{
StackPush(&s, pStr[i]);//入栈
continue;
}
else//右括号
{
if (StackEmpty(&s))//栈若为空
{
printf("右括号比左括号多\n");
return 0;
}
else//栈中有左括号
{
char Top = 0;
Top=StackTop(&s,&e);//获取栈顶元素
if ((Top == '(')&&(pStr[i] == ')'))//判断栈顶是否和 i 位置上的右括号匹配
{
StackPop(&s);
continue;
}
else if ((Top == '[')&&(pStr[i] == ']'))
{
StackPop(&s);
continue;
}
else if ((Top == '{')&&(pStr[i] == '}'))
{
StackPop(&s);
continue;
}
else//不匹配
{
printf("左右括号次序匹配不正确\n");
return 0;
}
}
}
continue;
}
}
if (StackEmpty(&s))
{
printf("括号匹配\n");
}
else
{
printf("左括号多于右括号\n");
}
}
int IsBrackets(char c)//判断字符是否为括号
{
if (('(' == c) ||( '[' == c) || ('{' == c) ||( ')' == c) ||( ']' == c) ||( '}' == c))
{
return 1;
}
else
{
return 0;
}
}