用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 用C语言编写源程序中的double deal_exp (char *exp) 函数,并计算出表达式:8*(2+3)+9–15/–3的值,返回结果。
时间: 2024-05-16 10:18:24 浏览: 103
以下是实现该功能的 C 语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LEN 100
double deal_exp(char *exp);
int main() {
char exp[MAX_LEN];
printf("请输入算术表达式:\n");
fgets(exp, MAX_LEN, stdin); // 从键盘读入表达式
exp[strlen(exp) - 1] = '\0'; // 去掉换行符
double result = deal_exp(exp);
printf("表达式的值为:%.2f\n", result);
return 0;
}
double deal_exp(char *exp) {
double num_stack[MAX_LEN]; // 数字栈
char op_stack[MAX_LEN]; // 运算符栈
int num_top = -1, op_top = -1; // 栈顶指针
int len = strlen(exp);
int i = 0;
while (i < len) {
if (isdigit(exp[i]) || exp[i] == '-') { // 处理数字
char num_str[MAX_LEN] = "";
int j = 0;
while (isdigit(exp[i]) || exp[i] == '-') {
num_str[j++] = exp[i++];
}
num_str[j] = '\0';
double num = atof(num_str);
num_stack[++num_top] = num;
} else if (exp[i] == '(') { // 处理左括号
op_stack[++op_top] = '(';
i++;
} else if (exp[i] == ')') { // 处理右括号
while (op_stack[op_top] != '(') {
char op = op_stack[op_top--];
double b = num_stack[num_top--];
double a = num_stack[num_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
op_top--; // 弹出左括号
i++;
} else if (exp[i] == '+' || exp[i] == '-') { // 处理加减号
while (op_top >= 0 && op_stack[op_top] != '(') {
char op = op_stack[op_top--];
double b = num_stack[num_top--];
double a = num_stack[num_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
op_stack[++op_top] = exp[i];
i++;
} else if (exp[i] == '*' || exp[i] == '/') { // 处理乘除号
while (op_top >= 0 && (op_stack[op_top] == '*' || op_stack[op_top] == '/')) {
char op = op_stack[op_top--];
double b = num_stack[num_top--];
double a = num_stack[num_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
op_stack[++op_top] = exp[i];
i++;
} else { // 忽略空格等无效字符
i++;
}
}
// 处理剩余的运算符
while (op_top >= 0) {
char op = op_stack[op_top--];
double b = num_stack[num_top--];
double a = num_stack[num_top--];
switch (op) {
case '+':
num_stack[++num_top] = a + b;
break;
case '-':
num_stack[++num_top] = a - b;
break;
case '*':
num_stack[++num_top] = a * b;
break;
case '/':
num_stack[++num_top] = a / b;
break;
}
}
return num_stack[0];
}
```
运行结果:
```
请输入算术表达式:
8*(2+3)+9-15/-3
表达式的值为:46.00
```
阅读全文