来人!!上题目!
一个字符串中有许多的括号! 例如字符串
ptr1[] = “a(()){[[]}]”; //次序
ptr2[] = “a(()){}[[]”; //左多
ptr3[] = “a(()){[[]]}]”; //右多
ptr4[] = “a(()){[[]]}”; //匹配
通过我们的眼睛,我们不难看出这些字符串的括号是否匹配,但是一旦字符串过长,便无法用眼睛了!!
于是乎,用一个函数、一串代码解决这个问题,不是特别煎蛋??
恭迎大人阅读解题思路
小心翼翼给大人递上代码
int Bracket(char ch)
{
if ('(' == ch || ')' == ch || //判断该字符是否是括号字符
'[' == ch || ']' == ch ||
'{' == ch || '}' == ch)
return 1;
else
return 0;
}
//用栈检测括号是否匹配
void MatchBrackets(char* Ptr)
{
assert(Ptr); //参数检测
int size = strlen(Ptr); //求字符串长度
int i = 0;
StackD s; //创建栈
StackDInit(&s, size); //栈初始化,容量为size
if (size == 0) //字符串为空
{
printf("无括号,匹配!! \n");
return;
}
else //字符串不为空
{
for (; i < size; i++) //从头开始一次判断 每个字符
{
if (Bracket(Ptr[i])) //对字符进行判断,看其是否为括号字符
{
if ('(' == Ptr[i] || '[' == Ptr[i] || '{' == Ptr[i]) //字符为左边括号 入栈
StackDPush(&s, Ptr[i]);
else //字符是右边括号
{
if (StackDSize(&s) == 0) //栈中没有左边括号,则说明右边括号多
{
printf("右边括号比左边括号多!!\n");
return;
}
else{ //栈中有左边括号,判断是否匹配? 匹配则出栈一次,不匹配则说明括号次序不匹配!
char ch = StackDTop(&s);
if (ch == '(' && Ptr[i] == ')' ||
ch == '[' && Ptr[i] == ']' ||
ch == '{' && Ptr[i] == '}')
StackDPop(&s);
else
{
printf("括号次序不匹配 !!!\n");
return;
}
}
}
}
}
if (StackDSize(&s) != 0) //判断完所有字符之后,判断栈中是否还有左边括号!
{
printf("左边括号比右边括号多!!\n");
return;
}
}
printf("括号匹配!!\n");
}
证据在此!!!
提醒:该函数调用了栈结构,关于栈结构的基本操作可以点这个链接
https://blog.csdn.net/code_zx/article/details/80812635
或者关注我,进主页查看哦