c语言,用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。不用栈
时间: 2023-11-13 11:05:58 浏览: 71
可以使用递归函数来解决这个问题,每次递归处理一个括号内的表达式。
具体实现步骤如下:
1. 读入用户输入的算术表达式。
2. 实现一个函数 `calculate(char *exp, int start, int end)`,用来计算从 `start` 到 `end` 的表达式的值。如果表达式中有括号,则递归调用 `calculate` 函数处理括号内的表达式。
3. 在 `calculate` 函数中,使用两个变量 `num` 和 `op`,分别表示当前数字和当前运算符。初始值为第一个数字和加号。
4. 循环遍历表达式中的每个字符,如果遇到数字,则更新 `num` 变量;如果遇到运算符,则根据当前的 `op` 变量进行计算,并更新 `num` 和 `op` 变量。
5. 最后返回计算得到的结果。
代码实现如下:
```c
#include <stdio.h>
int calculate(char *exp, int start, int end) {
int num = 0;
char op = '+';
int i;
for (i = start; i <= end; i++) {
if (exp[i] >= '0' && exp[i] <= '9') {
num = num * 10 + exp[i] - '0';
}
if (exp[i] == '(') {
int j = i + 1, cnt = 1;
while (cnt > 0) {
if (exp[j] == '(') cnt++;
if (exp[j] == ')') cnt--;
j++;
}
num = calculate(exp, i + 1, j - 2);
i = j - 1;
}
if (exp[i] == '+' || exp[i] == '-' || exp[i] == '*' || exp[i] == '/') {
switch (op) {
case '+': num = num; break;
case '-': num = -num; break;
case '*': num = num * (exp[i-1] - '0'); break;
case '/': num = num / (exp[i-1] - '0'); break;
}
op = exp[i];
}
}
switch (op) {
case '+': return num;
case '-': return -num;
case '*': return num * (exp[i-1] - '0');
case '/': return num / (exp[i-1] - '0');
}
}
int main() {
char exp[100];
printf("请输入算术表达式:");
scanf("%s", exp);
int result = calculate(exp, 0, strlen(exp)-1);
printf("结果为:%d\n", result);
return 0;
}
```
阅读全文