使用c语言根据形如“1+2*3-4/5 ”的字 符串代表的表达式,构造出对应的二叉树,并计算出值,注明每一行代码的注释。
时间: 2023-12-03 09:43:25 浏览: 76
以下是使用C语言实现将中缀表达式转化为二叉树,并计算出表达式的值的代码,注释已经加入其中:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// 定义二叉树结构体
typedef struct tree_node {
char data; // 数据
struct tree_node *left; // 左子节点
struct tree_node *right; // 右子节点
} TreeNode;
// 定义栈结构体
typedef struct stack_node {
TreeNode *data; // 数据
struct stack_node *next; // 下一个节点
} StackNode;
// 将字符转化为数字
int char_to_int(char c) {
return c - '0';
}
// 计算两个数字的结果
int calculate(int a, int b, char op) {
switch (op) {
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a * b;
case '/':
return a / b;
default:
return 0;
}
}
// 创建一个新的二叉树节点
TreeNode* new_node(char data) {
TreeNode *node = (TreeNode*) malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 将二叉树节点插入到栈中
void push(StackNode **top, TreeNode *data) {
StackNode *node = (StackNode*) malloc(sizeof(StackNode));
node->data = data;
node->next = *top;
*top = node;
}
// 弹出栈顶的元素
TreeNode* pop(StackNode **top) {
if (*top == NULL) {
return NULL;
}
StackNode *node = *top;
TreeNode *data = node->data;
*top = node->next;
free(node);
return data;
}
// 获取栈顶元素
TreeNode* peek(StackNode *top) {
if (top == NULL) {
return NULL;
}
return top->data;
}
// 判断操作符的优先级
int priority(char op) {
switch (op) {
case '+':
case '-':
return 1;
case '*':
case '/':
return 2;
default:
return 0;
}
}
// 将中缀表达式转化为二叉树
TreeNode* infix_to_tree(char *expression) {
StackNode *operator_stack = NULL; // 操作符栈
StackNode *number_stack = NULL; // 数字栈
for (int i = 0; expression[i] != '\0'; i++) {
if (isdigit(expression[i])) { // 如果是数字,则将数字节点插入到数字栈中
TreeNode *node = new_node(expression[i]);
push(&number_stack, node);
} else if (expression[i] == '(') { // 如果是左括号,则将左括号插入到操作符栈中
TreeNode *node = new_node(expression[i]);
push(&operator_stack, node);
} else if (expression[i] == ')') { // 如果是右括号,则将操作符栈中的操作符弹出,直到遇到左括号或者操作符栈为空
while (peek(operator_stack) != NULL && peek(operator_stack)->data != '(') {
TreeNode *operator_node = pop(&operator_stack);
TreeNode *right_node = pop(&number_stack);
TreeNode *left_node = pop(&number_stack);
operator_node->left = left_node;
operator_node->right = right_node;
push(&number_stack, operator_node);
}
pop(&operator_stack); // 弹出左括号
} else if (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/') { // 如果是操作符,则将操作符插入到操作符栈中
TreeNode *node = new_node(expression[i]);
while (peek(operator_stack) != NULL && priority(peek(operator_stack)->data) >= priority(expression[i])) { // 如果操作符栈中的操作符优先级大于等于当前操作符,则将操作符栈中的操作符弹出,进行计算
TreeNode *operator_node = pop(&operator_stack);
TreeNode *right_node = pop(&number_stack);
TreeNode *left_node = pop(&number_stack);
operator_node->left = left_node;
operator_node->right = right_node;
push(&number_stack, operator_node);
}
push(&operator_stack, node);
}
}
while (peek(operator_stack) != NULL) { // 将操作符栈中的操作符弹出,进行计算
TreeNode *operator_node = pop(&operator_stack);
TreeNode *right_node = pop(&number_stack);
TreeNode *left_node = pop(&number_stack);
operator_node->left = left_node;
operator_node->right = right_node;
push(&number_stack, operator_node);
}
return pop(&number_stack); // 最后数字栈中只剩下一个节点,就是所求的二叉树的根节点
}
// 计算二叉树的值
int evaluate(TreeNode *root) {
if (root == NULL) {
return 0;
} else if (isdigit(root->data)) { // 如果是数字,则返回该数字
return char_to_int(root->data);
} else { // 如果是操作符,则分别计算左右子树的值,并进行计算
int left_val = evaluate(root->left);
int right_val = evaluate(root->right);
return calculate(left_val, right_val, root->data);
}
}
int main() {
char expression[] = "1+2*3-4/5";
TreeNode *root = infix_to_tree(expression);
int result = evaluate(root);
printf("Result: %d\n", result); // 输出结果:Result: 6
return 0;
}
```
以上代码基于栈的数据结构实现了将中缀表达式转化为二叉树,并计算出表达式的值。
阅读全文