package cross.pauliuyou.calculator.base; import java.math.BigDecimal; import java.math.BigInteger; import java.math.MathContext; import java.util.Vector; /** * * @author 刘优 * @version 1.1 * * * * */ public class CalculateUnit { Vector numbers; Vector operators; public CalculateUnit(Vector nums,Vector ops) { numbers = nums; operators = ops; int j = 0; for (int i = 0; i < operators.size(); i++) { if (getOpObjNum(operators.get(i)) == 1) { numbers.add(i+j,numbers.get(i+j)); j++; } } } public BigDecimal calculate() throws CalculateException { int [] levels = new int[operators.size()]; for (int i = 0; i < levels.length; i++) { levels[i] = i; } sort(levels,operators); for (int i = 0; i < levels.length; i++) { int opPos = levels[i]; char op = operators.get(opPos); int numPos = opPos; int nullPos = -1; int nullNum = 0; boolean move = true; for (int j = opPos; j >=0; j--) { char tm = operators.get(j); if (tm != '0') { move = false; } else { if (!move) { nullPos = j; } nullNum++; } } if (nullPos != -1 && move) { numPos = nullPos; } else { numPos -= nullNum; } int objnum = this.getOpObjNum(op); switch (objnum) { case 1: case 2: BigDecimal left = numbers.get(numPos); BigDecimal right = numbers.get(numPos + 1); BigDecimal rs = cal(left,right,op); numbers.remove(numPos + 1); numbers.remove(numPos); numbers.add(numPos,rs); operators.remove(opPos); operators.add(opPos,'0'); break; case 3: default: break; } } return numbers.get(0); } protected static BigDecimal jie(BigDecimal x) throws CalculateException { if (x.compareTo(BigDecimal.ZERO) == -1 || x.toString().indexOf(".") != -1) { throw new CalculateException("负数或小数不允许算阶乘"); } BigInteger result = BigInteger.ONE; BigInteger num = new BigInteger(x.intValue() + ""); while (num.compareTo(BigInteger.ONE) == 1) { result = result.multiply(num); num = num.subtract(BigInteger.ONE); } return new BigDecimal(result); } private static BigDecimal sqrt(BigDecimal x) throws CalculateException { if (x.compareTo(BigDecimal.ZERO) == -1) { throw new CalculateException("负数不能开平方"); } return new BigDecimal(Math.sqrt(x.doubleValue()) + ""); } public static BigDecimal cal(BigDecimal x,BigDecimal y,char op) throws CalculateException { //System.out.println("cal : " + x + op + y); switch (op) { case '+' : return x.add(y); case '-' : return x.subtract(y); case '*' : return x.multiply(y); case '/' : if (y.compareTo(BigDecimal.ZERO) == 0) { throw new CalculateException("不允许除零!"); } return x.divide(y,MathContext.DECIMAL64); case '!' : return jie(x); case 's' : return sqrt(x); case 'p' : return x.pow(y.intValue()); default : throw new CalculateException("不支持的运算符 :" + op); } } private int getOpObjNum(char c) { if (c == '!' || c == 's') { return 1; } if (c == 'p') { return 2; } if (c == '*' || c == '/') { return 2; } if (c == '+' || c == '-') { return 2; } return 0; } private int getLevel(char c) { if (c == 'p') { return 70; } else if (c == '!' || c == 's') { return 60; } else if (c == '/') { return 50; } else if (c == '*') { return 49; } else if (c == '-') { return 40; } else if (c == '+') { return 39; } return 0; } private void sort(int [] in,Vector ops) { for (int i = 0; i < ops.size(); i++) { int t = getLevel(ops.get(in[i])); int pos = i; for (int j = i + 1; j < ops.size(); j++) { int t2 = getLevel(ops.get(in[j])); if (t2 > t) { t = t2; pos = j; } } if (pos != i) { int ttt = in[i]; in[i] = in[pos]; in[pos] = ttt; } } } public double oldCalculate(Vector numbers,Vector operators) throws CalculateException { BigDecimal d = null; while (operators.size() > 0) { for (int i = 0; i < operators.size(); i++) { char c = operators.get(i); if (getLevel(c) == 0) if (c == '*' || c == '/') { d = cal(numbers.get(i),numbers.get(i + 1),c); numbers.remove(i + 1); numbers.remove(i); numbers.add(i,d); operators.remove(i); break; } boolean hasMutli = false; for (int j = i + 1; j < operators.size(); j++) { if (operators.get(j) == '*' || operators.get(j) == '/') { hasMutli = true; break; } } if (!hasMutli) { d = cal(numbers.get(i),numbers.get(i + 1),operators.get(i)); numbers.remove(i + 1); numbers.remove(i); numbers.add(i,d); operators.remove(i); break; } } } return numbers.get(0).doubleValue(); } public String toString() { return "num : " + numbers.toString() + "/nops : " + operators.toString(); } }

java 复杂表达式计算_我的计算器. 用java实现的. 可以支持复杂表达式相关推荐

  1. 婴幼儿体重在线计算机,【婴儿体重计算器在线计算_婴儿体重计算器在线计算专题】- 天鹅到家...

    婴儿体重计算器在线计算-热门问答 Q:在线等答复,婴儿出生体重的最佳标准是多少? 你好,新生儿体重一般在6.3-6.7斤是.超重的胎儿首先面临的问题是难产,我们国家来说出生体重超过4250g,就建议剖 ...

  2. java 报文长度计算_从TcpClient.GetStream()读取而不知道长度 - java

    我正在研究基于TCP的通信协议.我所知 有很多方法可以确定何时结束阅读. 在消息末尾关闭连接 将消息的长度放在数据本身之前 使用分隔符:一些在正常数据中永远不会出现的值(或者总会以某种方式转义) 通常 ...

  3. java 指令重拍_我发现我的Java重拍了!

    java 指令重拍 在一月份,我写了一篇文章,介绍了一些我希望在Java语言中看到的变化,这些变化会让我更加喜欢它(并使它变得更现代). 很多人建议使用许多JVM语言,但我很大程度上不予理会,因为这不 ...

  4. java护照号码校验_学无止境之小白学java……第001天

    学习主题:预科阶段 对应视频: http://www.itbaizhan.cn/course/id/18.html 对应作业: 1. 为什么需要学编程,什么样的人可以做程序员? 编程是现实逻辑的表达, ...

  5. java青蛙过河打字_趣味算法——青蛙过河(JAVA)

    青蛙过河是一个非常有趣的智力游戏,其大意如下: 一条河之间有若干个石块间隔,有两队青蛙在过河,每队有3只青蛙,这些青蛙只能向前移动,不能向后移动,且一次只能有一只青蛙向前移动.在移动过程中,青蛙可以向 ...

  6. java azure blob 查询_快速入门:适用于 Java 的 Azure Blob 存储客户端库 v8 | Microsoft Docs...

    您现在访问的是微软AZURE全球版技术文档网站,若需要访问由世纪互联运营的MICROSOFT AZURE中国区技术文档网站,请访问 https://docs.azure.cn. 快速入门:使用 Jav ...

  7. java中接口文件创建_功能接口简介–在Java 8中重新创建的概念

    java中接口文件创建 世界各地的所有Java开发人员都将至少使用以下接口之一:java.lang.Runnable,java.awt.event.ActionListener,java.util.C ...

  8. java新手练习项目_有哪些好的java项目适合新手练习?

    要想学好java技术,找到高薪工作,不仅要掌握扎实的理论知识,也要有一定的实操能力. 遇到问题多查多问,可以上网站进行搜索,可以加一些交流群,还可以多问学校的老师--另外要学会欣赏他人的代码,向成功者 ...

  9. java面试题成都_成都汇智动力-java面试——多线程面试题

    原标题:成都汇智动力-java面试--多线程面试题 1.多线程有什么用?发挥多核CPU的优势 防止阻塞 便于建模 2.创建线程的方式继承Thread类 实现Runnable接口 至于哪个好,不用说肯定 ...

最新文章

  1. AFF镜像工具集afflib-tools
  2. 4键电子手表说明书_电子手表怎么调(电子手表的四个键的功能各是什么)
  3. OpenStack实践(一):Ubuntu16.04下DevStack方式搭建p版OpenStack
  4. CentOS 6.5系统安装配置图解教程(详细图文)
  5. 简述css布局技术的特点,div+css布局技术漫谈
  6. 音频处理八:(MFCC 的计算)
  7. Martix工作室考核题 —— 2019-3-8 第一题
  8. zabbix自定义key监控mysql主从同步超简单!
  9. powerpc-linux-gcc,关于powerpc-linux-uclibc-gcc的使用
  10. 无向图中两点之间的距离_九上数学:二次函数图像,一动点到两定点距离和最小...
  11. python中链表是什么_python 单链表的实现
  12. 20155338《网络对抗》Web安全基础实践
  13. 2020计算机应用模拟题,2020年函授本科计算机应用基础课后作业、模拟题及答案...
  14. 用计算机显示器主屏区域造句,显示器造句
  15. 模拟CMOS集成电路放大器总结(1)
  16. mysql 加号_从数据库中读取字符串时其中的空格变成加号
  17. 落花人独立,微雨燕双飞——晏几道《临江仙》
  18. 计算机课小组主题作业,计算机应用课程小组学习法的实践
  19. JDBC报错:The server time zone value is unrecognized or represents more than one time zone 已解决
  20. 福师大计算机考研分数,福建师范大学2019年考研复试分数线已公布

热门文章

  1. ANSI C和Glib C区别(二)
  2. C++禁止隐式转换之explicit用法
  3. Android启动的init进程
  4. ios libfdk-aac encode
  5. tensorflow之视频质量诊断
  6. tensorflow之数据集
  7. Hls之播放遇到的坑
  8. 写一个带输入输出的存储过程_携程大佬带你写一个可扩展的Spring插件。
  9. 网卡设置 多网卡的7种bond模式原理
  10. 播放量子计算机的声音,首次实现:用声音纠缠了两个量子比特!