C语言判断中缀表达式是否合法代码实现
时间: 2024-10-14 09:12:08 浏览: 17
c语言简易计算器实现中缀表达式四则混合运算
在C语言中,判断中缀表达式是否合法通常需要通过栈数据结构来实现,因为栈可以用来存储操作符及其优先级,然后逐个处理输入的数字和运算符。这里是一个简单的实现思路:
```c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
// 定义操作符的优先级
enum { PRECEDENCE_NONE = 0, ADD = 1, SUB = 2, MUL = 3, DIV = 4 };
bool is_valid_expression(char *expr) {
int op_count[5] = {0}; // 用于记录当前各优先级操作数的数量
bool is_number = false;
char token;
stack_t tokens; // 创建一个栈
for (token = *expr++; token != '\0'; token = *expr++) {
if (isdigit(token)) { // 数字字符
is_number = true;
continue;
}
if (is_number) {
double num = atof(&expr[-1]); // 将数字入栈
push(tokens, num);
is_number = false;
} else if (token == '+' || token == '-' || token == '*' || token == '/') { // 操作符
while (!stack_empty(tokens) && peek(tokens) != '(' && precedence(token) <= precedence(peek(tokens))) {
pop(tokens); // 出栈并处理上一级操作符
}
if (!stack_empty(tokens) && peek(tokens) == '(') { // 如果遇到左括号,直接入栈
push(tokens, token);
} else {
break; // 非法表达式,退出循环
}
} else if (token == ')') {
while (!stack_empty(tokens) && peek(tokens) != '(') { // 检查匹配的左括号
pop(tokens); // 处理操作符
}
if (stack_empty(tokens)) { // 未找到左括号,非法表达式
return false;
}
pop(tokens); // 移除左括号
} else { // 其他无效字符
return false;
}
}
// 检查剩余的操作符是否全部出栈
while (!stack_empty(tokens)) {
return false;
}
return true; // 表达式合法
}
typedef struct stack_t {
void **data;
size_t top;
size_t capacity;
} stack_t;
void push(stack_t *tokens, double value) {
tokens->data[tokens->top++] = &value;
}
double pop(stack_t *tokens) {
return *(tokens->data[--tokens->top]);
}
bool stack_empty(stack_t *tokens) {
return tokens->top == 0;
}
int precedence(char c) {
switch (c) {
case '+':
case '-':
return ADD;
case '*':
case '/':
return MUL;
default:
return PRECEDENCE_NONE;
}
}
int main() {
char expr[] = "2 + 3 * (4 - 1)";
if (is_valid_expression(expr))
printf("Valid expression.\n");
else
printf("Invalid expression.\n");
return 0;
}
```
这个代码片段展示了如何使用栈检查中缀表达式的基本流程。需要注意的是,这只是一个基础的实现,并未考虑完整的数学运算规则,例如处理括号、运算符优先级等高级特性。如果你需要一个更完整和精确的版本,可能需要引入更复杂的数据结构和算法。同时,`atof`函数在这里仅作为示例,实际应用中应使用更安全的字符串转浮点数函数。
阅读全文