判断±*/()混合运算是否有效C语言代码
时间: 2024-10-15 17:25:10 浏览: 39
在C语言中,判断±*/()混合运算的有效性通常涉及到解析表达式并遵循运算符优先级和结合性的规则。你可以通过构建一个简单的递归函数或者栈来处理这个问题。这里是一个基本的递归函数示例,用于检查给定字符串是否代表有效的数学表达式:
```c
#include <stdbool.h>
#include <stdio.h>
bool is_valid_expression(char* expression) {
int i = 0;
bool opening_bracket = false;
stack_t op_stack;
// 初始化空栈
init_stack(&op_stack);
while (expression[i]) {
if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') {
// 如果遇到操作符,需要前驱的也是操作符并且有正确的优先级
if (!opening_bracket && peek_stack(&op_stack)) {
char op = top_stack(&op_stack);
if ((expression[i] == '*' && op != '/') || (expression[i] == '/' && op != '*')) return false;
}
push_stack(&op_stack, expression[i]);
} else if (expression[i] == '(') {
opening_bracket = true;
} else if (expression[i] == ')') {
opening_bracket = false;
if (peek_stack(&op_stack) != '(') return false; // 非法匹配的括号
pop_stack(&op_stack); // 消耗左括号
} else if (isdigit(expression[i])) { // 数字字符
// 这里只是一个简化示例,实际应处理整个数字串并转换成整数
} else {
return false; // 遇到非数字、非操作符或未闭合的括号
}
i++;
}
// 检查括号是否已完全关闭
if (opening_bracket) return false;
// 表达式合法,如果没有错误的操作符配对
return isEmptyStack(&op_stack);
}
// 定义栈相关辅助函数...
// ...
int main() {
char expression[] = "((5+3)*2)/4";
if (is_valid_expression(expression)) {
printf("表达式 %s 是有效的。\n", expression);
} else {
printf("表达式 %s 不是有效的。\n", expression);
}
return 0;
}
```
这个代码示例并不完美,但它可以作为一个起点。在实际应用中,你可能需要完善处理数字部分以及考虑更全面的运算符优先级规则。
阅读全文