复习教材算法5.12和5.13的相关内容,完成表达式树的创建,表达式树的求值。要求编写完整程序,输入算术表达式,并以#结束,中间计算过程要是个位数(例如“3+1*3-6/3”),求解表达式的值。
时间: 2024-02-05 21:13:44 浏览: 33
以下是Python实现:
```python
class Node:
"""
定义节点类
"""
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class ExpressionTree:
"""
表达式树类,包括创建表达式树和求解表达式树的值两个方法
"""
def __init__(self):
self.root = None
def create_tree(self, expression: str) -> Node:
"""
创建表达式树
:param expression: 算术表达式字符串
:return: 表达式树的根节点
"""
stack = []
for char in expression:
if char.isdigit():
node = Node(char)
stack.append(node)
else:
right = stack.pop()
left = stack.pop()
node = Node(char)
node.left = left
node.right = right
stack.append(node)
self.root = stack.pop()
return self.root
def evaluate(self, root: Node) -> int:
"""
求解表达式树的值
:param root: 表达式树的根节点
:return: 表达式的值
"""
if root.val.isdigit():
return int(root.val)
left_val = self.evaluate(root.left)
right_val = self.evaluate(root.right)
if root.val == '+':
return left_val + right_val
elif root.val == '-':
return left_val - right_val
elif root.val == '*':
return left_val * right_val
else:
return left_val // right_val
if __name__ == '__main__':
expression = input("请输入算术表达式:")
if expression[-1] != '#':
expression += '#'
tree = ExpressionTree()
root = tree.create_tree(expression)
print(f"表达式树的根节点为:{root.val}")
result = tree.evaluate(root)
print(f"表达式的值为:{result}")
```
在程序中,我们首先定义了节点类 `Node`,其中包括节点的值和左右子节点;然后定义了表达式树类 `ExpressionTree`,其中包括创建表达式树和求解表达式树的值两个方法。在 `create_tree` 方法中,我们使用栈来构建表达式树,具体的实现思路是:
1. 遍历输入的算术表达式字符串,如果当前字符是数字,则创建一个节点,并将其压入栈中;
2. 如果当前字符是运算符,则从栈中弹出两个节点作为当前节点的左右子节点,然后将当前节点压入栈中;
3. 最后,栈中只剩下一个节点,即为表达式树的根节点。
在 `evaluate` 方法中,我们使用递归的方式求解表达式树的值,具体的实现思路是:
1. 如果当前节点的值是数字,则直接返回该数字;
2. 如果当前节点的值是运算符,则递归求解左右子树的值,然后根据当前运算符进行计算,并返回计算结果。
最后,在主程序中,我们输入算术表达式字符串,调用 `create_tree` 方法创建表达式树,并输出表达式树的根节点;然后调用 `evaluate` 方法求解表达式树的值,并输出结果。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)