用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/(),编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果,不使用栈
时间: 2023-11-16 22:05:33 浏览: 30
好的,我理解了你的问题。对于这个问题,我们可以使用递归的方法来求解表达式。
具体来说,我们可以定义一个函数 `eval()`,它的作用是对一个不包含括号的表达式求值。然后,我们可以在 `deal_exp()` 中逐步解析表达式,每当遇到一个括号时,就递归地调用 `eval()` 来求解括号内的表达式。
下面是具体的源代码实现:
```c++
double eval(char *exp, int start, int end) {
// 处理单个数字的情况
if (start == end) {
return exp[start] - '0';
}
// 处理带符号的数字的情况
int sign = 1;
if (exp[start] == '-') {
sign = -1;
start++;
}
else if (exp[start] == '+') {
start++;
}
// 处理乘法和除法
double num1 = 0, num2 = 0;
int op = -1;
for (int i = start; i <= end; i++) {
if (exp[i] == '*' || exp[i] == '/') {
num1 = eval(exp, start, i - 1);
num2 = eval(exp, i + 1, end);
op = exp[i];
break;
}
}
if (op != -1) {
if (op == '*') {
return sign * num1 * num2;
}
else {
return sign * num1 / num2;
}
}
// 处理加法和减法
double res = 0;
num1 = 0, num2 = 0;
op = '+';
for (int i = start; i <= end; i++) {
if (exp[i] == '(') {
int cnt = 1;
i++;
while (cnt > 0) {
if (exp[i] == '(') {
cnt++;
}
else if (exp[i] == ')') {
cnt--;
}
i++;
}
num1 = eval(exp, i, end);
break;
}
else if (exp[i] == '+' || exp[i] == '-') {
num1 = eval(exp, start, i - 1);
num2 = eval(exp, i + 1, end);
op = exp[i];
break;
}
}
if (op == '+') {
res = sign * num1 + num2;
}
else {
res = sign * num1 - num2;
}
return res;
}
double deal_exp(char *exp) {
int len = strlen(exp);
return eval(exp, 0, len - 1);
}
```
使用这个函数,我们可以方便地对一个算术表达式求值,而不需要使用栈。