一、问题描述及其要求
【问题描述】
设计一个简单的算术表达式计算器。
【基本要求】
实现标准整数类型的四则运算表达式的求值(包含括号,可多层嵌入).
【测试数据】
(30+2*70)/3-12*3
5+(9*(62-37)+15)*6
要求自行设计非法表达式,进行程序测试,以保证程序的稳定运行。
【实现提示】
可以设计以下辅助函数
status isNumber(char ReadInChar); //视ReadInchar 是否是数字而返回 TRUE 或 FALSE 。
int TurnToInteger(char IntChar); // 将字符’0’.’9’ 转换为整数 9
二、问题分析
【问题分析】
设计一个简单的算术表达式计算器,需要注意的是由于有括号的存在所以相同的运算符具有不同的优先级,可以对数据进行处理,添加一个用于储存优先级的属性,然后再用二叉树进行计算。
三、逻辑设计
首先需要创建两个类
Ele | 含有String val和int weight 两个属性,val用来储存相关符号或者数字,weight用来储存该符号或者数字的权值。 |
TreeNode | 用于生成二叉树的相关结点,具有String val,TreeNode left,TreeNode right 三个属性。 |
相关算法:
List readList(String exp):返回一个List<Ele> 的列表,只包含四个运算符、数值、及其权值。
TreeNode tree(List<Ele> list,int left,int right) :根据优先级的的先作为根来生成二叉树。并返回根结点
midTraverse(TreeNode root):对二叉树进行中序遍历并且计算,返回得到的结果。
main():调用相关算法并且输出值。
四、物理设计
(一)List readList(String exp):
1、新建一个列表list来储存所需结果。 int weight 初始值为0;新建一个字符串数组用来储存exp根据""来分割得到的数组。
2、对字符串数组进行遍历,当遇到"("或者"(" 的时候权值加一,并跳过本次循环,遇到")"或者")"权值减一并跳过本次循环,其他情况,将字符串及此时的权值初始化为一个Ele类,然后添加到list里。
3、对list进行遍历,将两个相邻的数字字符进行连接起来。
4、返回list列表,此时list列表里就只含有四个运算符号以及相关数字。
(二)TreeNode tree(List<Ele> list,int left,int right):
1、创建一个新的root
如果list的大小为0则返回一个空的root。
2、运用递归进行创建:
临界条件:left==right,返回一个val值为list.get(left)的root
从list中下标为left到right进行遍历,找到权值最低的那个运算符并且是同级运算符中的第一个运算符作为根结点的值。
在调用本算法求其左子树和右子树的值。
(三)midTraverse(TreeNode root):
递归:
临界条件:当root的值不是四则运算符时返回其转化为整数的值。
如果是四个运算符则返回(midTraverse(root.left) 运算符midTraverse(root.right))运算后的值。