c语言,用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。不用栈
时间: 2023-11-13 14:05:59 浏览: 69
可以使用递归函数来实现表达式求值。
算法思路:
1. 将表达式字符串作为参数传入递归函数中。
2. 检查表达式中是否存在括号,如果有,则先计算括号内的表达式。
3. 从左到右扫描表达式,找出第一个运算符。
4. 根据运算符,将表达式分为左右两个子表达式。
5. 递归计算左右两个子表达式的值。
6. 将左右两个子表达式的值根据运算符进行计算得到结果。
代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
int evaluate(char *expr, int start, int end);
int main() {
char expr[100];
printf("Enter an arithmetic expression: ");
scanf("%s", expr);
int result = evaluate(expr, 0, strlen(expr) - 1);
printf("Result: %d\n", result);
return 0;
}
int evaluate(char *expr, int start, int end) {
int i, j, num;
char op;
int result, operand1, operand2;
// 处理括号内的表达式
if (expr[start] == '(' && expr[end] == ')') {
return evaluate(expr, start + 1, end - 1);
}
// 查找加减运算符
for (i = end; i >= start; i--) {
if (expr[i] == ')') {
i = start + 1;
while (expr[i] != ')') {
i++;
}
} else if (expr[i] == '+' || expr[i] == '-') {
break;
}
}
// 查找乘除运算符
for (j = i; j >= start; j--) {
if (expr[j] == ')') {
j = start + 1;
while (expr[j] != ')') {
j++;
}
} else if (expr[j] == '*' || expr[j] == '/') {
i = j;
break;
}
}
// 没有找到运算符,说明表达式只有一个数字
if (i == start - 1) {
num = 0;
for (j = start; j <= end; j++) {
num = num * 10 + (expr[j] - '0');
}
return num;
}
// 计算左右子表达式的值
operand1 = evaluate(expr, start, i - 1);
operand2 = evaluate(expr, i + 1, end);
// 根据运算符计算结果
op = expr[i];
switch (op) {
case '+': result = operand1 + operand2; break;
case '-': result = operand1 - operand2; break;
case '*': result = operand1 * operand2; break;
case '/': result = operand1 / operand2; break;
}
return result;
}
```
注意:上述代码并没有对输入的表达式进行错误检查,如果输入的表达式不合法,程序可能会出现错误。
阅读全文