(5) 【编程题】算术表达式求值。演示程序和源程序已给出。用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。不限制方法,你可以用“原始”的多遍扫描字符串,也可以用先进一点的栈(本课程前面接触的栈都是操作系统提供给程序以实现局部变量定义和函数调用的,现在你需要自己创建并使用栈了)。为便于集中精力在功能方面,可以不用检查用户输入的合法性。
时间: 2024-02-06 19:13:01 浏览: 76
算术表达 式求值
5星 · 资源好评率100%
以下是算术表达式求值的代码实现,使用栈来计算表达式:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define MAX_LEN 100
typedef struct {
double data[MAX_LEN];
int top;
} Stack;
void push(Stack *s, double value) {
if (s->top == MAX_LEN - 1) {
printf("Stack is full.\n");
exit(1);
}
s->data[++s->top] = value;
}
double pop(Stack *s) {
if (s->top == -1) {
printf("Stack is empty.\n");
exit(1);
}
return s->data[s->top--];
}
double deal_exp(char *exp) {
Stack nums, ops;
nums.top = -1;
ops.top = -1;
char *p = exp;
while (*p) {
if (isdigit(*p) || *p == '.') {
double num = strtod(p, &p);
push(&nums, num);
} else if (*p == '+' || *p == '-') {
while (ops.top != -1 && (ops.data[ops.top] == '+' || ops.data[ops.top] == '-' || ops.data[ops.top] == '*' || ops.data[ops.top] == '/')) {
double b = pop(&nums);
double a = pop(&nums);
char op = pop(&ops);
double result = 0;
switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
push(&nums, result);
}
push(&ops, *p);
p++;
} else if (*p == '*' || *p == '/') {
while (ops.top != -1 && (ops.data[ops.top] == '*' || ops.data[ops.top] == '/')) {
double b = pop(&nums);
double a = pop(&nums);
char op = pop(&ops);
double result = 0;
switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
push(&nums, result);
}
push(&ops, *p);
p++;
} else if (*p == '(') {
push(&ops, *p);
p++;
} else if (*p == ')') {
while (ops.data[ops.top] != '(') {
double b = pop(&nums);
double a = pop(&nums);
char op = pop(&ops);
double result = 0;
switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
push(&nums, result);
}
pop(&ops);
p++;
} else {
p++;
}
}
while (ops.top != -1) {
double b = pop(&nums);
double a = pop(&nums);
char op = pop(&ops);
double result = 0;
switch (op) {
case '+':
result = a + b;
break;
case '-':
result = a - b;
break;
case '*':
result = a * b;
break;
case '/':
result = a / b;
break;
}
push(&nums, result);
}
return pop(&nums);
}
int main() {
char exp[MAX_LEN];
printf("Enter an expression: ");
fgets(exp, MAX_LEN, stdin);
printf("Result: %g\n", deal_exp(exp));
return 0;
}
```
该程序首先定义了一个栈的结构体,其中包含一个数组和一个栈顶指针top。push函数将一个元素压入栈中,pop函数将栈顶元素弹出。deal_exp函数使用两个栈,一个用于存储数字,一个用于存储运算符。程序遍历表达式的每个字符,如果是数字,则将其转换为double类型并压入数字栈中;如果是运算符,则根据优先级将其压入运算符栈中或者从栈中弹出运算符和数字进行计算,将计算结果压入数字栈中。最后,当表达式遍历完毕后,将剩余的运算符和数字进行计算,最终得到表达式的结果。
阅读全文