假设表达式中允许出现两种括号:圆括号()和方括号[],其嵌套的顺序随意,即( [ ( ) ( ) ] )或者 [ ( [ ] [ ] ) ]等为正确的表达式,但是 ( [ ( ] ) 或者 [ ( [ ) ] 或者 ( [ ( ] ) )等为错误的表达式。检查括号是否匹配可以采用如下逻辑:
- 遍历整个表达式
- 如果是左括号入栈
- 如果是右括号则从栈中出栈一个括号,如果与右括号匹配则继续往后遍历,如果不匹配则说明是错误的表达式
- 如果表示遍历完毕,最后栈为空说明表达式正确否则说明表达式错误
核心代码:
int brackets_match(void)
{
//从堆上申请一段空间用于存放字符串
char *str = (char *)malloc(str_size);
//初始化一个链表栈
LinkStack s = stack_init();
printf("plz input A expression : ");
scanf("%s",str);
//遍历整个表达式
int i = 0;
char f;
while(str[i]!='\0'){
//如果左括号直接入栈
if(str[i]=='('||str[i]=='{'||str[i]=='['){
Push(&s,str[i]);
i++;
continue;
}
//如果是右括号,就出站
switch (str[i]) {
case ')':
pup(&s, &f);
if (f == '(') {
i++;
continue;
} else {
printf("The parentheses do not match correctly");
return FALSE;
}
break;
case '}':
pup(&s, &f);
if (f == '{') {
i++;
continue;
} else {
printf("The parentheses do not match correctly");
return FALSE;
}
break;
case ']':
pup(&s, &f);
if (f == '[') {
i++;
continue;
} else {
printf("The parentheses do not match correctly");
return FALSE;
}
break;
default:
break;
}
i++;
}
if(s==NULL)
{
printf("Parentheses match correctly\r\n");
return TRUE;
} else
{
printf("The parentheses do not match correctly\r\n");
return FALSE;
}
}
结果显示: