前言
设计实现过程
数据结构
使用
二叉树
存放四则运算式,比如1+2×3÷(4-5)+6这个表达式就可以使用以下二叉树表示,中序遍历二叉树时就可以还原四则运算。
作业要求四则运算式中不能出现负数,(4-5)在二叉树中调换位置即可。
2.2 实现步骤
在主函数
main()
中输入
-n
,
-r
两个参数, 传入并执行
generateMap()
函数,在
generateMap()
中用for循环
new
ArithmeticTree
对象,在
ArithmeticTree
的构造器中,计算了四则运算结果,返回一个
OperatorNode
结点,在
generateMap()
函数调用
ArithmeticTree
对象中的值,包括计算出的结果,调用
hashMap.put()
保存在
HashMap
对象中,再传入
writFile()
写出文件。
三、代码说明
类 | 功能 |
---|---|
|
主函数,获取输入值,计算结果 |
|
构建四则运算的二叉树 |
|
分数的四则运算操作 |
|
存放数据的结点 |
|
存放操作符的结点 |
|
IO流操作,文件输入输出 |
|
随机生成四则运算 |
/**
* 获取随机范围内的随机整数
* @param range 范围
* @return 随机数
*/
public static int getRandomInRange(int range) {
ThreadLocalRandom random = ThreadLocalRandom.current();
return random.nextInt(range);
}
/**
* 构建生成四则运算表达式的二叉树
* @param number 运算符数量
* @return 二叉树头节点
*/
public DataNode generateNode(int number) {
//如果是0就构造叶子节点
if (number == 0) {
return new DataNode(FractionOperation.generateFraction(), null, null, 1);
}
//其他都是构造符号节点
OperatorNode rootNode = new OperatorNode(null, null, OPERATORS[GenerateUtils.getRandomInRange(4)]);
int leftNum = GenerateUtils.getRandomInRange(number);
//递归下去构造左孩子和右孩子
rootNode.left = generateNode(leftNum);
//总数要减去当前已经构建出来的这一个节点
rootNode.right = generateNode(number - 1 - leftNum);
//计算结果
FractionOperation result = calculate(rootNode.operator, rootNode.left.result, rootNode.right.result);
//如果是负数,交换左右孩子
if (result.isNegative()) {
DataNode tmp = rootNode.left;
rootNode.left = rootNode.right;
rootNode.right = tmp;
}
rootNode.result = result;
rootNode.high = Math.max(rootNode.left.high, rootNode.right.high) + 1;
return rootNode;
}
四、测试运行