写安卓写了三年有余了吧!今天无聊,在网上看看安卓的计算器竟然没有一个实现的好的,真实让人心寒啊!java
闲着无聊,我也写了一个java实现计算器,代码简单易懂,稍微有那么点很差懂的我都写了详细的注释的!算法
那我就先说说个人思路吧!测试
/**
* 计算器算法
* @author Lxiang
* 思想:
* 把一个字符串表达式,拆分红两个集合,一个集合包含计算中的数,一个集合包含计算中的符号
* 1.把一个表达式中的运算子提取出来
* 2.把一个表达式中的数提取出来
* 3.遍历运算子集合,优先运算乘法和除法(遇到乘法除法的时候,移除运算子,并计算)
* 4.以后剩下的就是加法和减法,依次遍历计算
* 5.若是有括号的状况,递归调用
* 计算的核心思路
* 从运算子集合中取出一个运算子
* 在取出运算子的位置从运算参数的集合中的取出参与运算的两个数 参与运算的数是两个连续数
*/spa
那么,核心算法其实就很简单了,也就是一个递归的过程和一个四则运算,可谓so easy!.net
那么,废话很少说,上核心代码code
/** * 不带括弧的核心算法 * @param exp 表达式 * @return 结果 */ public static double calc(String exp) { //1.把一个表达式中的运算子提取出来 List<Character> operations = getOperation(exp); //2.把一个表达式中的数提取出来 List<Double> numbers = getNumbers(exp); //遍历计算(乘法和除法) for (int i = 0; i < operations.size(); i++) { //遍历获取运算子 char op = operations.get(i); //若是这个运算子是乘法或者除法 if (op == '*' || op == '/') { //移除这个运算子 Character remove = operations.remove(i); //须要在同一个位置取出对应的运算数 Double double1 = numbers.remove(i); //由于list的特性 移除了以后整个数据会向前移动一位 所以第二个数据就在当前的角标位置 Double double2 = numbers.remove(i); //判断是乘法仍是除法 作相应的运算 double1 = (remove == '*' ? double1*double2 : double1/double2); //计算完成以后 还须要在同一个位置插入运算数 numbers.add(i,double1); } } //遍历计算加法和减法 while (!operations.isEmpty()) { //一次计算 因此每次都是第一个运算符 char op = operations.remove(0); //须要在同一个位置取出对应的运算数 Double double1 = numbers.remove(0); //由于list的特性 移除了以后整个数据会向前移动一位 所以第二个数据就在当前的角标位置 Double double2 = numbers.remove(0); //判断是乘法仍是除法 作相应的运算 double1 = (op == '-' ? double1-double2 : double1+double2); //计算完成以后 还须要在同一个位置插入运算数 numbers.add(0,double1); } //计算完了之后 集合中还会剩下一个元素 就是结果 return numbers.get(0); }
这样的话,在集合中留下的最后一个运算数就是结果了!blog
那么,来测试一下结果吧!递归
System.out.println(Calc.calculator("(-2.3*-3+32/(2*(-3+(-3))-3))*2+(3+5)"));
有不服的小伙伴儿能够本身计算结果哦,如今贴出源码,喜欢的自行下载哦!下载地址:http://download.csdn.net/download/ynztlxdeai/9566400
此处只贴出了没有括号的算法,源码中有贴出有括号的算法!