输入简单算术表达式,利用二叉树来表示,并在创建表达式树后求表达式的值。 ·[基本要求] 用二叉树每个结点代表一个运算符或运算数,简单数学表达式中只包含+、、*、/和一位正整数且格式正确。 [基本要求] 根据形如“1+2*3-4/5”的字 符串代表的表达式,构造出对应的二叉树 并计算出表达式的值。 ·[实现提示] 可用二叉链表表示,通过遍历实现。用c语言实现
时间: 2023-07-16 11:14:04 浏览: 233
以下是用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;
}
// 构建表达式树
TreeNode* buildExpressionTree(char* postfix) {
TreeNode* stack[100];
int top = -1;
for (int i = 0; postfix[i] != '\0'; i++) {
if (isdigit(postfix[i])) { // 数字入栈
TreeNode* node = createNode(postfix[i]);
stack[++top] = node;
} else if (postfix[i] == '+' || postfix[i] == '-' || postfix[i] == '*' || postfix[i] == '/') { // 运算符出栈,构建节点,再入栈
TreeNode* node = createNode(postfix[i]);
node->right = stack[top--];
node->left = stack[top--];
stack[++top] = node;
}
}
return stack[top];
}
// 计算表达式树的值
int evaluateExpressionTree(TreeNode* root) {
if (root->left == NULL && root->right == NULL) { // 叶子节点为数字
return root->data - '0';
} else { // 非叶子节点为运算符,递归计算左右子树,进行运算
int left = evaluateExpressionTree(root->left);
int right = evaluateExpressionTree(root->right);
switch (root->data) {
case '+': return left + right;
case '-': return left - right;
case '*': return left * right;
case '/': return left / right;
}
}
}
int main() {
char postfix[] = "12+3*45/-";
TreeNode* root = buildExpressionTree(postfix);
printf("表达式树的值为:%d", evaluateExpressionTree(root));
return 0;
}
```
这里我们采用后缀表达式,先将中缀表达式转换成后缀表达式,再根据后缀表达式构建表达式树,最后对表达式树进行递归计算。表达式树的每个节点代表一个运算符或运算数,计算时遇到数字直接返回,遇到运算符则递归计算左右子树,进行运算。
阅读全文