使用c语言输入简单算术表达式,利用 二叉树来表示,并在创建表 达式树后求表达式的值,并写出清楚的代码解释
时间: 2024-01-22 10:17:22 浏览: 79
c语言 实现二叉树操作 用栈实现算术表达式求值
以下是实现输入简单算术表达式,利用二叉树来表示并求值的C语言代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
// 创建二叉树节点
TreeNode* createNode(char data) {
TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 销毁二叉树
void destroyTree(TreeNode* root) {
if (root) {
destroyTree(root->left);
destroyTree(root->right);
free(root);
}
}
// 判断是否为操作符
int isOperator(char c) {
return (c == '+' || c == '-' || c == '*' || c == '/');
}
// 将表达式转换为二叉树
TreeNode* createExpressionTree(char* expression) {
TreeNode* root = NULL;
TreeNode* current = NULL;
TreeNode* parent = NULL;
int i = 0;
while (expression[i] != '\0') {
char c = expression[i];
if (isdigit(c)) {
current = createNode(c);
} else if (isOperator(c)) {
current = createNode(c);
current->left = parent;
parent = current;
} else if (c == '(') {
if (parent) {
if (parent->left == NULL) {
parent->left = createExpressionTree(expression + i + 1);
} else {
parent->right = createExpressionTree(expression + i + 1);
}
} else {
root = createExpressionTree(expression + i + 1);
}
while (expression[i] != ')') {
i++;
}
} else if (c == ')') {
break;
}
if (parent && parent->right) {
parent = parent->right;
} else if (current) {
parent = current;
}
i++;
}
return root ? root : current;
}
// 计算二叉树表达式的值
int calculateExpressionTree(TreeNode* root) {
if (root == NULL) {
return 0;
}
if (isdigit(root->data)) {
return root->data - '0';
}
int leftValue = calculateExpressionTree(root->left);
int rightValue = calculateExpressionTree(root->right);
switch (root->data) {
case '+': return leftValue + rightValue;
case '-': return leftValue - rightValue;
case '*': return leftValue * rightValue;
case '/': return leftValue / rightValue;
default: return 0;
}
}
int main() {
char expression[100];
printf("请输入简单算术表达式:\n");
scanf("%s", expression);
TreeNode* root = createExpressionTree(expression);
printf("表达式的值为:%d\n", calculateExpressionTree(root));
destroyTree(root);
return 0;
}
```
代码解释:
1. 定义了二叉树节点结构体 `TreeNode`,包含了节点的数据和左右子节点指针。
2. 定义了函数 `createNode`,用于创建二叉树节点。函数内部调用了 `malloc` 分配内存空间。
3. 定义了函数 `destroyTree`,用于销毁二叉树。函数使用递归方式遍历二叉树,释放每个节点的内存空间。
4. 定义了函数 `isOperator`,用于判断字符是否为操作符。
5. 定义了函数 `createExpressionTree`,用于将表达式字符串转换为二叉树。函数使用循环遍历表达式字符串,根据字符类型创建节点并连接到父节点。如果遇到左括号,则递归创建子树并返回父节点。
6. 定义了函数 `calculateExpressionTree`,用于计算二叉树表达式的值。函数使用递归方式遍历二叉树,如果节点为数字,则返回数字值。如果节点为操作符,则递归计算左右子树的值并进行相应的运算。
7. 在 `main` 函数中,读取用户输入的表达式字符串,并调用函数 `createExpressionTree` 创建二叉树。然后调用函数 `calculateExpressionTree` 计算表达式的值,并输出结果。最后调用函数 `destroyTree` 销毁二叉树。
阅读全文