数据结构用算符优先法对算数表达式求值C语言代码
时间: 2024-10-25 18:10:14 浏览: 76
在C语言中,你可以使用递归算法和栈数据结构来实现算术表达式的计算,特别是当采用算符优先解析(Operator Precedence Parsing,也称为短路评估或Shunting Yard算法)时。这里是一个简单的例子:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
typedef struct {
double value;
char operator;
} Token;
Token* pop_token(char* input) {
// ... (处理输入字符串并返回Token)
}
void evaluate_expression(Token* tokens, int size) {
if (size == 0) return; // 表达式结束
Stack<Token*> stack;
for (int i = 0; i < size; ++i) {
Token* token = tokens + i;
switch (token->operator) {
case '+':
case '-':
while (!stack.empty() && has_higher_precedence(token->operator, stack.peek()->operator)) {
Token* top = stack.pop();
printf("%f %c %f = %f\n", token->value, top->operator, stack.peek()->value, apply_operator(top->value, stack.peek()->value, top->operator));
stack.push(top);
}
stack.push(token);
break;
case '*':
case '/':
while (!stack.empty() && is_arithmetic_op(stack.peek()->operator)) {
Token* top = stack.pop();
printf("%f %c %f = %f\n", token->value, top->operator, stack.peek()->value, apply_operator(top->value, stack.peek()->value, top->operator));
stack.push(top);
}
stack.push(token);
break;
default: // 这里假设遇到数字就直接入栈
stack.push(token);
break;
}
}
while (!stack.empty()) {
Token* top = stack.pop();
printf("%f %c", top->value, top->operator); // 输出剩余的操作数和运算符
}
}
double apply_operator(double left, double right, char op) {
switch (op) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
default: return 0; // 如果遇到未知的运算符,可以抛异常或处理错误
}
}
int main() {
char* input = "5 + 3 * 2";
Token* tokens = tokenize(input); // 将输入转换为Token数组
int size = ...; // 获取tokens大小
evaluate_expression(tokens, size);
free(tokens); // 清理内存
return 0;
}
```
在这个示例中,`tokenize()`函数用于将输入字符串分解成Token数组,`has_higher_precedence()`和`is_arithmetic_op()`用于判断运算符优先级。实际项目中,你需要编写更多的辅助函数来处理这些细节。
注意这只是一个基础版本,实际应用可能会更复杂,包括错误处理、括号处理等。同时,这个示例并没有包含完整的错误检查和边界条件处理。
阅读全文