用c语言通过二叉链表遍历输入简单的字符串算术表达式,构造出对应的二叉树,并计算表达式的值,并注释每一行代码,解释为什么要这样写,核心代码是哪一块?写出完整代码
时间: 2024-02-22 19:57:25 浏览: 91
输入后缀表达式,即时生成对应的二叉树,计算出表达式的值,并且输出对应的前缀表达式、中缀表达式
好的,下面是完整的代码,其中包括了注释:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 100 // 定义栈的最大大小
// 定义二叉链表节点的结构体
typedef struct TreeNode {
char data; // 节点存储的数据,可以是数字或运算符
struct TreeNode *leftChild; // 左子节点
struct TreeNode *rightChild; // 右子节点
} TreeNode, *pTreeNode;
// 构造二叉树的函数
pTreeNode buildTree(char *expr) {
pTreeNode stack[MAX_SIZE]; // 定义一个栈
int top = -1; // 栈顶指针初始化为-1
pTreeNode p, q; // 定义两个指针,p为当前节点,q为栈顶元素
char ch = '\0'; // 存储遍历的当前字符
int i = 0; // 表达式字符串的下标
while ((ch = expr[i++]) != '\0') { // 循环遍历表达式字符串
switch (ch) {
case '(':
// 左括号,将当前节点入栈
stack[++top] = p;
p = NULL;
break;
case ')':
// 右括号,将当前节点赋值给栈顶节点的右子节点
p = stack[top--];
break;
case '+':
case '-':
case '*':
case '/':
// 运算符,创建一个新节点,将栈顶元素作为新节点的左子节点,
// 当前节点作为新节点的右子节点,新节点入栈
q = (pTreeNode)malloc(sizeof(TreeNode));
q->data = ch;
q->leftChild = p;
q->rightChild = NULL;
p = q;
break;
default:
// 数字,创建一个新节点,将当前数字作为新节点的数据,
// 新节点入栈
q = (pTreeNode)malloc(sizeof(TreeNode));
q->data = ch;
q->leftChild = NULL;
q->rightChild = NULL;
p = q;
break;
}
}
return p;
}
// 计算表达式值的函数
int calc(pTreeNode root) {
if (root == NULL) { // 如果根节点为空,返回0
return 0;
}
if (root->leftChild == NULL && root->rightChild == NULL) { // 如果当前节点是叶子节点,返回节点存储的数据
return root->data - '0';
}
int leftVal = calc(root->leftChild); // 递归计算左子树的值
int rightVal = calc(root->rightChild); // 递归计算右子树的值
switch (root->data) { // 根据当前节点的运算符,计算左右子树的值,并返回结果
case '+':
return leftVal + rightVal;
case '-':
return leftVal - rightVal;
case '*':
return leftVal * rightVal;
case '/':
return leftVal / rightVal;
default:
return 0;
}
}
int main() {
char expr[MAX_SIZE]; // 定义一个字符数组,用于存储输入的表达式
printf("请输入一个简单的算术表达式:");
scanf("%s", expr); // 读入输入的表达式
pTreeNode root = buildTree(expr); // 构造二叉树
int result = calc(root); // 计算表达式值
printf("表达式 %s 的计算结果为:%d\n", expr, result);
return 0;
}
```
在 `main` 函数中,我们先读入输入的表达式字符串,然后调用 `buildTree` 函数构造二叉树,最后调用 `calc` 函数计算表达式的值并输出结果。
核心代码是 `buildTree` 和 `calc` 函数,它们分别实现了构造二叉树和计算表达式值的功能。
阅读全文