假设一个算术表达式中包含圆括弧)万括狐和花括事三种类型的括弧,编写一个判别表达式中括弧是否正确配对的函数correct(exp.tag);其中:exp为字符串类型的变量(可理解为每个字符占用一个数组元素),表示被判别的表达式,tag为布尔型变量。C语言
时间: 2024-10-21 22:04:00 浏览: 10
在C语言中,为了判断一个包含圆括弧()、万括狐[]和花括号{}的算术表达式中的括号是否正确配对,你可以使用栈数据结构。以下是实现思路:
```c
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
typedef enum {LEFT_PAREN = 0, RIGHT_PAREN, LEFT_SQUARE, RIGHT_SQUARE, LEFT_CURLY, RIGHT_CURLY} BracketType;
bool correctBrackets(const char* exp) {
stacksize_t stackSize = 0;
char stack[50]; // 容纳50个括号足够处理大部分情况
bool bracketTypes[6] = {false, false, false, false, false, false}; // 标记每种括号的状态
for (int i = 0; exp[i] != '\0'; ++i) {
if (exp[i] == '(' || exp[i] == '[' || exp[i] == '{') { // 遇到左括号
stack[stackSize++] = exp[i];
bracketTypes[LEFT_PAREN + (exp[i] - '(')] = true; // 根据类型更新标记
} else if (exp[i] == ')' && bracketTypes[LEFT_PAREN]) { // 遇到右括号
if (!bracketTypes[LEFT_PAREN + (exp[i] - ')')]) return false; // 没有对应的左括号,则错误
bracketTypes[LEFT_PAREN] = false; // 移除对应左括号的标记
stackSize--;
} else if (exp[i] == ']' && bracketTypes[LEFT_SQUARE]) { // ...其他类型的情况类似
if (!bracketTypes[LEFT_SQUARE + (exp[i] - ']')]) return false;
bracketTypes[LEFT_SQUARE] = false;
stackSize--;
} else if (exp[i] == '}' && bracketTypes[LEFT_CURLY]) {
if (!bracketTypes[LEFT_CURLY + (exp[i] - '}')]) return false;
bracketTypes[LEFT_CURLY] = false;
stackSize--;
}
}
// 如果所有左括号都找到了对应的右括号,但栈未为空,则表示缺少右括号
return stackSize == 0;
}
int main() {
const char* testExp = "(([]{})())";
if (correctBrackets(testExp)) {
printf("表达式的括号配对正确.\n");
} else {
printf("表达式的括号配对错误.\n");
}
return 0;
}
```
这个函数会检查输入的`exp`字符串中的括号是否正确配对。如果括号配对错误,它将返回`false`,反之则返回`true`。
阅读全文