设计一个算法判别一个算术表达式的圆括号是否正确配对 【输入形式】 一个以@为结尾的算术表达式 【输出形式】 若配对,则输出圆括号的对数;否则输出no 【样例输入】(a+b)/(c+d)@ 【样例输出】 2 【样例说明】共有两对括号,输出2 【评分标准】 使用栈相关知识,否则不能得分用c语言实现
时间: 2023-11-30 16:02:19 浏览: 78
好的,以下是使用 C 语言实现括号匹配的算法:
```c
#include <stdio.h>
#include <string.h>
#define MAX_EXPR_LEN 100
int check_parentheses(char expr[]) {
char stack[MAX_EXPR_LEN];
int top = 0, i, count = 0;
for (i = 0; i < strlen(expr); i++) {
if (expr[i] == '(') {
stack[top++] = '(';
} else if (expr[i] == ')') {
if (top == 0 || stack[--top] != '(') {
return -1; // 括号不匹配,返回 -1
} else {
count++;
}
}
}
if (top != 0) {
return -1; // 括号不匹配,返回 -1
} else {
return count; // 返回括号对数
}
}
int main() {
char expr[MAX_EXPR_LEN];
scanf("%s", expr);
int result = check_parentheses(expr);
if (result == -1) {
printf("no\n");
} else {
printf("%d\n", result);
}
return 0;
}
```
程序首先定义了一个字符数组 `stack` 作为栈,用一个整数 `top` 记录栈顶位置。然后遍历输入的表达式,如果遇到左括号,就把它压入栈中,如果遇到右括号,就从栈中弹出一个左括号,如果弹出的左括号与当前右括号不匹配,就说明括号不配对,直接返回 `-1`。最后,如果遍历完整个表达式后,栈不为空,也说明括号不匹配,返回 `-1`,否则返回栈中左括号的个数。
在 `main()` 函数中,程序首先读入输入的表达式,然后调用 `check_parentheses()` 函数判断括号是否匹配,如果返回 `-1`,就输出 "no",否则输出括号对数。
例如,对于输入字符串"(a+b)/(c+d)@",程序会输出"2",表示括号全部配对。
阅读全文