c语言算术表达式求值。要求运行结果显示为“请输入一个算术表达式(e退出)”用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/()。 编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果。
时间: 2024-01-21 13:17:36 浏览: 81
c语言实现表达式求值
以下是一个简单的 C 语言算术表达式求值程序,实现了对输入的算术表达式的求值,支持负数、加减乘除和括号操作。
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_SIZE 100
// 定义操作符栈结构体
typedef struct {
char op[STACK_SIZE];
int top;
} OpStack;
// 定义操作数栈结构体
typedef struct {
double val[STACK_SIZE];
int top;
} ValStack;
// 操作符栈入栈函数
void op_push(OpStack *stack, char c) {
if (stack->top >= STACK_SIZE) {
printf("Error: op stack overflow!\n");
exit(1);
}
stack->op[stack->top++] = c;
}
// 操作符栈出栈函数
char op_pop(OpStack *stack) {
if (stack->top <= 0) {
printf("Error: op stack underflow!\n");
exit(1);
}
return stack->op[--stack->top];
}
// 操作数栈入栈函数
void val_push(ValStack *stack, double val) {
if (stack->top >= STACK_SIZE) {
printf("Error: val stack overflow!\n");
exit(1);
}
stack->val[stack->top++] = val;
}
// 操作数栈出栈函数
double val_pop(ValStack *stack) {
if (stack->top <= 0) {
printf("Error: val stack underflow!\n");
exit(1);
}
return stack->val[--stack->top];
}
// 获取操作符栈顶元素函数
char op_top(OpStack *stack) {
if (stack->top <= 0) {
printf("Error: op stack underflow!\n");
exit(1);
}
return stack->op[stack->top - 1];
}
// 获取操作数栈顶元素函数
double val_top(ValStack *stack) {
if (stack->top <= 0) {
printf("Error: val stack underflow!\n");
exit(1);
}
return stack->val[stack->top - 1];
}
// 判断是否为操作符函数
int is_op(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')');
}
// 判断操作符优先级函数
int op_precedence(char c) {
switch (c) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 处理单个操作符函数
void deal_op(OpStack *op_stack, ValStack *val_stack) {
char op = op_pop(op_stack);
double val2 = val_pop(val_stack);
double val1 = val_pop(val_stack);
double res;
switch (op) {
case '+':
res = val1 + val2;
break;
case '-':
res = val1 - val2;
break;
case '*':
res = val1 * val2;
break;
case '/':
res = val1 / val2;
break;
default:
printf("Error: invalid operator!\n");
exit(1);
}
val_push(val_stack, res);
}
// 对算术表达式求值函数
double deal_exp(char *exp) {
OpStack op_stack = {{0}, 0};
ValStack val_stack = {{0}, 0};
char *p = exp;
while (*p) {
if (isspace(*p)) {
// 忽略空白字符
} else if (isdigit(*p) || (*p == '-' && isdigit(*(p + 1)))) {
// 处理数字
char *q = p;
while (isdigit(*q) || *q == '-') {
q++;
}
double val = atof(p);
val_push(&val_stack, val);
p = q - 1;
} else if (*p == '(') {
// 处理左括号
op_push(&op_stack, '(');
} else if (*p == ')') {
// 处理右括号
while (op_top(&op_stack) != '(') {
deal_op(&op_stack, &val_stack);
}
op_pop(&op_stack);
} else {
// 处理操作符
while (op_precedence(*p) <= op_precedence(op_top(&op_stack))) {
deal_op(&op_stack, &val_stack);
}
op_push(&op_stack, *p);
}
p++;
}
while (op_stack.top > 0) {
deal_op(&op_stack, &val_stack);
}
return val_pop(&val_stack);
}
int main() {
printf("请输入一个算术表达式(e退出)\n");
char exp[STACK_SIZE];
while (fgets(exp, STACK_SIZE, stdin)) {
if (exp[0] == 'e') {
break;
}
double res = deal_exp(exp);
printf("%.2f\n", res);
printf("请输入一个算术表达式(e退出)\n");
}
return 0;
}
```
注意,这个程序还有很多可以完善的地方,比如处理错误、增加更多的操作符等等。但是,以上代码已经可以满足题目要求。
阅读全文