最近在考虑一个问题:公司项目可能会使用运算模板来计算相应的值,模板freemarker、velocity都是不错的选择。那通过模板将计算公式字符串组装出来后,就需要解析字符串得到计算结果,以下是我的实现:
public class Arithmetic { private char[] oper = { '+', '-', '*', '/', '(', ')' }; public static void main(String args[]) { Arithmetic arith = new Arithmetic(); System.out.println(System.currentTimeMillis()); BigDecimal result = arith.parserExpression("(1+2/(3+(1+2.01)))*3/(1+2*(3+(1+2.01)))*3/(1+2*(3+(1+2.01)))*3/(1+2*(3+(1+2.01)))*3"); System.out.println(System.currentTimeMillis()); System.out.println(result.toString()); } private boolean contains(char[] array, char v) { for (char e : array) if (e == v) return true; return false; } public BigDecimal parserExpression(String expression) { Stack<Object> stack1 = new Stack<Object>(); StringBuffer sb = new StringBuffer(); for (int i = 0; i < expression.length(); i++) { char c = expression.charAt(i); if (this.contains(oper, c)) { if (sb.length() > 0) { BigDecimal bigdecimal = new BigDecimal(sb.toString()); stack1.push(bigdecimal); sb = new StringBuffer(); } stack1.push(c); } else { sb.append(c); if (i == expression.length() - 1) { BigDecimal bigdecimal = new BigDecimal(sb.toString()); stack1.push(bigdecimal); } } } Stack<Object> stack2 = new Stack<Object>(); while (!stack1.isEmpty()) { Object o = stack1.pop(); if (o instanceof Character) { char c = (Character) o; if (c == '(') { //处理最小运算单元 BigDecimal subResult = this.subExpression(stack2); stack2.push(subResult); continue; } } stack2.push(o); } return this.subExpression(stack2); } private BigDecimal subExpression(Stack<Object> stack) { ArrayList<Object> list = new ArrayList<Object>(); while (!stack.isEmpty()) { Object o = stack.pop(); if (o instanceof Character) { char c = (Character) o; if (c == ')') { break; } } list.add(o); } return calculation(list); } private BigDecimal calculation(ArrayList<Object> list) { Stack<Object> stack3 = new Stack<Object>(); boolean priority = false; char sign = 0; for (int i = 0; i < list.size(); i++) { Object o = list.get(i); if (o instanceof Character) { char c = (Character) o; if (c == '*' || c == '/') { priority = true; sign = c; continue; } } if (priority) { Object preObject = stack3.pop(); BigDecimal preBigDecimal = (BigDecimal) preObject; BigDecimal nxtBigDecimal = (BigDecimal) o; if (sign == '*') { BigDecimal result = preBigDecimal.multiply(nxtBigDecimal); stack3.push(result); } else { BigDecimal result = preBigDecimal.divide(nxtBigDecimal, 6, BigDecimal.ROUND_HALF_UP); stack3.push(result); } priority = false; sign = 0; continue; } stack3.push(o); } BigDecimal result = new BigDecimal(0); while (!stack3.isEmpty()) { Object last = stack3.pop(); if (last instanceof Character) { throw new RuntimeException(); } if (stack3.isEmpty()) { result = result.add((BigDecimal) last); return result; } Object abs = stack3.pop(); if (!(abs instanceof Character)) { throw new RuntimeException(); } char c = (Character) abs; if (c == '+') { result = result.add((BigDecimal) last); } else { result = result.add(((BigDecimal) last).negate()); } } return result; } }
相关推荐
自己写的课程设计 基于Java实现四则运算题目生成程序
通过java语言实现四则运算 package sss; public class Szys { float op1; float op2; char opr; float result; public void calculate() { switch (this.opr) { case '+': { this....
很好的程序,供大家参考。大家多提意见哈。我们共同学习
Java实现四则运算表达式.doc
java四则运算8次实验之第三次,用多个类实现的。
java简易计算器,能够进行四则运算、三角函数运算,已实现优先级。 将中缀表达式转化成后缀表达式(逆波兰表达式) 主要运用了栈、简单的数学知识,java图形界面设计等相关知识
四则运算的公共方法类2种思想 1.传入带参数表达式和参数Map 2.先将表达式转化为数字表达式,然后直接计算
使用图形用户界面编写一个小学生整数四则运算练习软件。程序启动后,用户输入用户名,然后选择做什么运算(加、减、乘、除、混合)、做几位数的运算,再单击“开始做题”,之后计算机按要求随机生成10道题目,用户...
使用java多态性,编写复数的四则运算实例
java实现自动生成四则运算实验报告
计算器的实现 算法题 逆波兰表达式实现优先级判断
基于java的四则运算计算器设计与实现毕业设计任务书.pdf基于java的四则运算计算器设计与实现毕业设计任务书.pdf基于java的四则运算计算器设计与实现毕业设计任务书.pdf基于java的四则运算计算器设计与实现毕业设计...
基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业...
利用java实现的四则运算(加减乘除),功能绝对的强大啊!!保证对你有帮助,不会让你后悔
该资源为基于Java的四则运算练习系统,用户可以在该系统进行练习,考试,查看错题,和进行算法小游戏。练习和考试可以选择难度,通过考试后会提升自己的能力等级,解锁更高难度的测试。练习和考试中错的题目将记载入...
一个java类,该类可以进行加、减、乘、除四则运算,并且可以输出运算结果。此外,对于除法,如果被除数为0,该类可以报错。对于加、减、乘、除之外的运算符,该类应该告知无法处理。 编写一个包含主方法main的公共类...
这是一款用java语言实现的四则运算计算器,支持正负数、小数点。
本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能: 由计算机从题库文件中随机选择 20 道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计 5 分,错误不...