编写一个程序exp78.cpp,先用二叉树来表示一个简单算术表达式,树的每一个结点包括一个运算符或运算数。简单算术表达式中只包含+、—、*、/和一位正整数且格式正确(不包含括号),并且要按照先乘除后加减的原则构造二叉树。如下图所示是“1+2*3-4/5”代数表达式对应的二叉树,然后由对应的二叉树计算该表达式的值。
时间: 2024-03-07 09:46:32 浏览: 127
以下是一个 C++ 程序,可以根据输入的算术表达式构造出对应的二叉树,并计算表达式的值:
```cpp
#include <iostream>
#include <stack>
#include <string>
using namespace std;
// 二叉树结点
struct TreeNode {
char val;
TreeNode* left;
TreeNode* right;
TreeNode(char v) : val(v), left(nullptr), right(nullptr) {}
};
// 计算二叉树的值
int calc(TreeNode* root) {
if (!root) {
return 0;
}
if (!root->left && !root->right) {
return root->val - '0';
}
int left_val = calc(root->left);
int right_val = calc(root->right);
switch (root->val) {
case '+': return left_val + right_val;
case '-': return left_val - right_val;
case '*': return left_val * right_val;
case '/': return left_val / right_val;
default: return 0;
}
}
int main() {
stack<TreeNode*> s;
string expr;
cout << "请输入算术表达式:";
getline(cin, expr);
for (char ch : expr) {
if (isdigit(ch)) {
s.push(new TreeNode(ch));
} else {
TreeNode* node = new TreeNode(ch);
node->right = s.top();
s.pop();
node->left = s.top();
s.pop();
s.push(node);
}
}
int result = calc(s.top());
cout << "表达式的值为:" << result << endl;
return 0;
}
```
在这个程序中,我们首先定义了一个二叉树结点 `TreeNode`,包含一个 `char` 类型的值和左右子树指针。然后,我们使用一个栈 `s` 来辅助构造二叉树。我们遍历算术表达式中的每个字符,如果是数字,则创建一个只包含该数字的二叉树结点并将其入栈;如果是运算符,则创建一个包含该运算符的二叉树结点,并从栈中弹出两个结点作为其左右子树,然后将该结点入栈。最终,栈顶结点就是完整的二叉树根结点。
为了计算二叉树的值,我们定义了一个递归函数 `calc`,它接受一个二叉树结点指针作为参数。如果该结点是叶子节点,则返回该节点的值;否则,递归计算左右子树的值,并根据运算符对它们进行运算。注意,在计算除法时,我们使用的是整数除法,即舍去小数部分。最终,程序输出表达式的值。
阅读全文