用c语言写通过二叉链表遍历将算术表达式转换为二叉树并求值,注释代码
时间: 2024-02-24 08:54:03 浏览: 94
以下是通过二叉链表遍历将算术表达式转换为二叉树并求值的 C 语言代码,包含注释说明:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树节点结构体
typedef struct TreeNode {
char data; // 节点数据
struct TreeNode *left; // 左子节点
struct TreeNode *right; // 右子节点
} TreeNode;
// 定义栈结构体
typedef struct Stack {
TreeNode **items; // 存储节点指针的数组
int top; // 栈顶指针
int size; // 栈的最大容量
} Stack;
// 创建一个新的栈
Stack *createStack(int size) {
Stack *stack = (Stack *) malloc(sizeof(Stack));
stack->items = (TreeNode **) malloc(size * sizeof(TreeNode *));
stack->size = size;
stack->top = -1;
return stack;
}
// 判断栈是否为空
int isEmpty(Stack *stack) {
return stack->top == -1;
}
// 判断栈是否已满
int isFull(Stack *stack) {
return stack->top == stack->size - 1;
}
// 入栈操作
void push(Stack *stack, TreeNode *item) {
if (isFull(stack)) {
printf("Error: Stack is full\n");
return;
}
stack->items[++stack->top] = item;
}
// 出栈操作
TreeNode *pop(Stack *stack) {
if (isEmpty(stack)) {
printf("Error: Stack is empty\n");
return NULL;
}
return stack->items[stack->top--];
}
// 获取栈顶元素
TreeNode *peek(Stack *stack) {
if (isEmpty(stack)) {
printf("Error: Stack is empty\n");
return NULL;
}
return stack->items[stack->top];
}
// 判断一个字符是否是操作符
int isOperator(char c) {
return c == '+' || c == '-' || c == '*' || c == '/';
}
// 通过二叉链表遍历将算术表达式转换为二叉树
TreeNode *constructTree(char postfix[]) {
int i = 0;
Stack *stack = createStack(strlen(postfix));
while (postfix[i] != '\0') {
char c = postfix[i];
if (isOperator(c)) {
TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode));
node->data = c;
node->right = pop(stack);
node->left = pop(stack);
push(stack, node);
} else {
TreeNode *node = (TreeNode *) malloc(sizeof(TreeNode));
node->data = c;
node->left = NULL;
node->right = NULL;
push(stack, node);
}
i++;
}
TreeNode *root = pop(stack);
return root;
}
// 求二叉树的值
int evaluateTree(TreeNode *root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return root->data - '0'; // 将字符转换为数字
}
int leftValue = evaluateTree(root->left);
int rightValue = evaluateTree(root->right);
switch (root->data) {
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue / rightValue;
default:
printf("Error: Invalid operator %c\n", root->data);
return 0;
}
}
// 测试代码
int main() {
char postfix[] = "23+45+*"; // 后缀表达式 "2+3*4+5"
TreeNode *root = constructTree(postfix);
int result = evaluateTree(root);
printf("Result: %d\n", result); // 输出结果 25
return 0;
}
```
以上代码实现了通过二叉链表遍历将算术表达式转换为二叉树并求值的功能,具体实现过程包括:
1. 定义二叉树节点结构体 `TreeNode`,包含节点数据和左右子节点指针;
2. 定义栈结构体 `Stack`,使用数组存储节点指针,并实现入栈、出栈、获取栈顶元素等操作;
3. 实现判断一个字符是否是操作符的函数 `isOperator`;
4. 实现通过二叉链表遍历将算术表达式转换为二叉树的函数 `constructTree`,遍历表达式字符串,遇到操作数创建节点并入栈,遇到操作符弹出两个节点作为左右子节点创建新节点并入栈;
5. 实现求二叉树的值的函数 `evaluateTree`,递归遍历二叉树,遇到操作数返回该节点的值,遇到操作符递归计算左右子节点的值并根据操作符进行运算;
6. 在 `main` 函数中测试代码。
阅读全文