输入一个中缀算术表达式,求解表达式的值。运算符包括“+”、“-”、“*”、“/”、“(”、“)”、“=”,参与运算的数为double 类型且为正数。(要求:直接使用中缀算术表达式进行计算,不能转换为后缀或前缀表达式再进行计算,只考虑二元运算即可)C语言
时间: 2024-12-01 15:09:55 浏览: 63
在C语言中,直接处理中缀算术表达式并求解其值涉及到递归和堆栈数据结构。你可以创建一个函数,利用堆栈来模拟运算过程。以下是基本的步骤:
1. 定义一个`char`类型的数组存储输入的中缀表达式。
2. 定义一个辅助函数`evaluate()`,接受当前待处理字符和两个双精度浮点数(分别表示最近的操作数和操作符优先级)。
3. 使用堆栈来存储数字和操作符:
- 遇到数字,将其压入堆栈作为操作数。
- 遇到运算符,检查其优先级是否大于当前堆栈顶的操作符,如果是,则将当前操作数弹出,与堆栈顶部的操作符一起计算结果,并将新结果和新的运算符压入堆栈;否则,保留当前运算符等待后续更高优先级的运算符。
4. 当遇到右括号`)`时,意味着表达式结束,可以开始计算直到遇到左括号。取出堆栈中的所有元素进行计算。
5. 最后,堆栈中剩下的只有一个元素就是最终的结果。
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
double evaluate(char op, double b, double a) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // 注意除数不能为0
default: return 0; // 括号的情况,这里简单处理
}
}
double calculate(char* expression) {
double num = 0, result = 0;
int i = 0, len = strlen(expression);
char op = ' ';
stack_t ops = {0}; // 自定义堆栈结构
for (; i < len && expression[i] != '\0'; ++i) {
if (isdigit(expression[i])) {
num = num * 10 + expression[i] - '0';
if (i == len - 1 || expression[i + 1] == ' ') {
result += evaluate(op, num, result);
num = 0;
op = ' ';
}
} else {
op = expression[i];
push(&ops, op); // 将运算符压入堆栈
}
}
// 处理表达式结尾的情况
if (num > 0)
result += evaluate(op, num, result);
while (!isEmpty(&ops)) {
op = pop(&ops);
result = evaluate(op, pop(&ops), result);
}
return result;
}
int main() {
char expression[] = "1 + 2 * 3"; // 示例表达式
printf("结果: %.2f\n", calculate(expression));
return 0;
}
```
阅读全文