假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回"YES";否则返回“NO”。表达式长度小于255,左圆括号少于20个 用c语言写
时间: 2024-10-14 15:03:31 浏览: 32
栈》的解题报告.ppt
你可以使用栈数据结构来解决这个问题,因为栈是一种后进先出的数据结构,正好适用于处理括号匹配的问题。这里是一个简单的C语言函数,用于检查括号是否匹配:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
bool isParenthesesMatched(char *expression) {
int stackSize = 0;
char openParens[] = {'(', '{', '['};
char closeParens[] = {')', '}', ']'};
const int parensCount = sizeof(openParens) / sizeof(openParens[0]);
for (int i = 0; expression[i] != '@'; ++i) {
if (expression[i] == '(' || expression[i] == '{' || expression[i] == '[') {
// 如果遇到开括号,入栈
stackSize++;
} else if (expression[i] == ')' || expression[i] == '}' || expression[i] == ']') {
// 遇到闭括号,检查栈顶是否匹配
if (stackSize == 0 || openParens[closeParens.index(expression[i])] != openParens[stackSize - 1]) {
return false;
}
// 匹配成功,出栈
stackSize--;
}
}
// 检查所有括号都已关闭
return stackSize == 0;
}
int main() {
char expr[] = "((()))";
if (isParenthesesMatched(expr)) {
printf("YES\n");
} else {
printf("NO\n");
}
return 0;
}
```
这个程序会遍历输入的表达式,如果遇到开括号就压入栈,遇到闭括号就检查栈顶的开放括号是否匹配,如果不匹配或栈为空则立即返回false。遍历结束后,如果没有剩余的开括号在栈里,说明所有的括号都匹配了。
阅读全文