使用c语言通过二叉链表求根据任意字符串 代表的表达式,构造出对应的二叉树, 并计算出表达式的值,并写出清楚明了 的代码注释。
时间: 2023-12-03 13:43:57 浏览: 71
以下是使用 C 语言通过二叉链表求根据任意字符串代表的表达式,构造出对应的二叉树,并计算出表达式的值的代码实现,已经详细注释。
```c
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>
// 定义二叉树节点结构体
struct node {
char data; // 节点存储的值
struct node *left; // 左子树指针
struct node *right; // 右子树指针
};
// 定义操作符优先级函数
int priority(char c) {
if (c == '+' || c == '-') {
return 1;
} else if (c == '*' || c == '/') {
return 2;
} else {
return 0;
}
}
// 定义构建二叉树函数
struct node* build_tree(char *s, int start, int end) {
// 如果start > end,返回NULL
if (start > end) {
return NULL;
}
// 分配节点内存
struct node* root = (struct node*)malloc(sizeof(struct node));
int i;
// 如果字符串s[start:end]是数字,将其作为叶子节点
if (isdigit(s[start])) {
root->data = s[start];
root->left = NULL;
root->right = NULL;
return root;
}
// 如果字符串s[start:end]不是数字,找到最后一个操作符
int op = -1;
int brackets = 0;
for (i = start; i <= end; i++) {
if (s[i] == '(') {
brackets++;
} else if (s[i] == ')') {
brackets--;
} else if (brackets == 0 && priority(s[i]) > op) {
op = priority(s[i]);
}
}
// 根据最后一个操作符分割字符串,构建二叉树
for (i = end; i >= start; i--) {
if (s[i] == '(') {
brackets++;
} else if (s[i] == ')') {
brackets--;
} else if (brackets == 0 && priority(s[i]) == op) {
root->data = s[i];
root->left = build_tree(s, start, i - 1);
root->right = build_tree(s, i + 1, end);
return root;
}
}
// 如果没有找到操作符,说明字符串格式错误,返回NULL
free(root);
return NULL;
}
// 定义计算二叉树表达式值函数
int calculate(struct node* root) {
// 如果根节点为NULL,返回0
if (root == NULL) {
return 0;
}
// 如果根节点为数字,返回该数字
if (isdigit(root->data)) {
return root->data - '0';
}
// 否则,根据操作符计算左右子树的值,并返回结果
int left_value = calculate(root->left);
int right_value = calculate(root->right);
switch (root->data) {
case '+':
return left_value + right_value;
case '-':
return left_value - right_value;
case '*':
return left_value * right_value;
case '/':
return left_value / right_value;
}
return 0;
}
int main() {
char s[] = "5+((1+2)*4)-3"; // 待计算的表达式
struct node* root = build_tree(s, 0, sizeof(s) - 2); // 构建二叉树
int result = calculate(root); // 计算表达式值
printf("%s = %d\n", s, result); // 输出结果
return 0;
}
```
以上就是使用 C 语言通过二叉链表求根据任意字符串代表的表达式,构造出对应的二叉树,并计算出表达式的值的完整代码实现。
阅读全文