用C语言写一个表达式计算器
时间: 2023-07-01 11:12:28 浏览: 80
好的,下面是一个用C语言实现的表达式计算器,它支持加、减、乘、除、括号等基本运算符和功能:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义表达式节点
struct expr_node {
char op;
int val;
struct expr_node *left;
struct expr_node *right;
};
// 解析表达式字符串并构建表达式树
struct expr_node *parse_expr(char *expr);
// 计算表达式树的值
int eval_expr(struct expr_node *node);
// 释放表达式树的内存
void free_expr(struct expr_node *node);
// 创建表达式节点
struct expr_node *create_node(char op, int val) {
struct expr_node *node = (struct expr_node*)malloc(sizeof(struct expr_node));
node->op = op;
node->val = val;
node->left = NULL;
node->right = NULL;
return node;
}
// 解析数字
int parse_number(char *expr, int *index) {
int val = 0;
while (isdigit(expr[*index])) {
val = val * 10 + (expr[*index] - '0');
(*index)++;
}
return val;
}
// 解析表达式
struct expr_node *parse_expr_inner(char *expr, int *index) {
struct expr_node *node = NULL;
char op = '\0';
while (expr[*index] != '\0') {
if (isdigit(expr[*index])) {
int val = parse_number(expr, index);
node = create_node(op, val);
} else if (expr[*index] == '(') {
(*index)++;
struct expr_node *sub_node = parse_expr_inner(expr, index);
if (node == NULL) {
node = sub_node;
} else {
node->right = sub_node;
}
} else if (expr[*index] == ')') {
(*index)++;
return node;
} else if (expr[*index] == '+' || expr[*index] == '-' || expr[*index] == '*' || expr[*index] == '/') {
op = expr[*index];
(*index)++;
} else {
(*index)++;
}
}
return node;
}
// 解析表达式字符串并构建表达式树
struct expr_node *parse_expr(char *expr) {
int index = 0;
return parse_expr_inner(expr, &index);
}
// 计算表达式树的值
int eval_expr(struct expr_node *node) {
if (node == NULL) {
return 0;
}
if (node->op == '\0') {
return node->val;
}
int left_val = eval_expr(node->left);
int right_val = eval_expr(node->right);
switch (node->op) {
case '+':
return left_val + right_val;
case '-':
return left_val - right_val;
case '*':
return left_val * right_val;
case '/':
return left_val / right_val;
}
return 0;
}
// 释放表达式树的内存
void free_expr(struct expr_node *node) {
if (node != NULL) {
free_expr(node->left);
free_expr(node->right);
free(node);
}
}
// 主函数
int main() {
char expr[100];
printf("请输入表达式:");
scanf("%s", expr);
struct expr_node *root = parse_expr(expr);
int result = eval_expr(root);
printf("表达式的值为:%d\n", result);
free_expr(root);
return 0;
}
```
您可以将以上代码保存为一个.c文件并编译运行,输入表达式后即可计算出表达式的值。
阅读全文