问题描述
表达式中的合法括号为“(”、“)”、“[”、“]”、“{”、“}”,这三种括号可以按照任意的次序嵌套使用。
请写一个程序,判断给定表达式中的括号是否匹配,既左右括号顺序和数量都匹配。
输入说明
输入为一个表达式字符串,长度不超过50。
输出说明
对输入的表达式,若其中的括号是匹配的,则输出“yes”,否则输出“no”。
#include <stdio.h>
#include <string.h>
int isMatching(char expr[]) {//判断括号是否匹配的函数,匹配则返回1,否则返回0
int len = strlen(expr);
char stack[len];//仅存储所有左括号
int top = -1;//初始下标设为-1
for (int i = 0; i < len; i++) {
if (expr[i] == '(' || expr[i] == '[' || expr[i] == '{') {
stack[++top] = expr[i];
}
else if (expr[i] == ')' || expr[i] == ']' || expr[i] == '}') {
if (top == -1) {
return 0;
}//无左括号的情况,直接返回0
char open = stack[top--];
/*将字符open从右向左依次赋值为左括号,与右括号就近比较,匹配一个成功后,stack左移,
*与新的右括号继续比较*/
if ((expr[i] == ')' && open != '(') || (expr[i] == ']' && open != '[') || (expr[i] == '}' && open != '{')) {//就近比较
return 0;
}
}
}
if (top == -1) {
return 1;//
} else {
return 0;
}
}
int main() {
char expr[51];
scanf("%s", expr);
if (isMatching(expr)) {
printf("yes\n");
} else {
printf("no\n");
}
return 0;
}
欢迎评论区留言交流。