最近在考虑一个问题:公司项目可能会使用运算模板来计算相应的值,模板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的课程设计中,我们探讨了如何利用Java语言实现这样的功能。...
本实验“java实现四则运算 第三次实验”旨在通过创建多个类来实现加、减、乘、除等基本算术操作。这个实验的目的是加深对Java类结构、方法重载以及对象交互的理解。 首先,我们来讨论如何在Java中创建一个基础的四...
很好的程序,供大家参考。大家多提意见哈。我们共同学习
Java实现四则运算表达式 Java中四则运算表达式的实现是计算机科学中一个重要的领域。四则运算表达式是指包含加、减、乘、除四种基本运算符的数学表达式。这些表达式可以用不同的记法来表示,包括中缀记法、前缀记法...
Java简易计算器是一个基于Java编程语言实现的计算工具,它不仅支持基本的四则运算,还具备处理三角函数的能力,并且已经实现了运算的优先级规则。这个项目的核心是将用户输入的中缀表达式(常见的数学表达式形式)...
通过java语言实现四则运算 package sss; public class Szys { float op1; float op2; char opr; float result; public void calculate() { switch (this.opr) { case '+': { this....
四则运算的公共方法类2种思想 1.传入带参数表达式和参数Map 2.先将表达式转化为数字表达式,然后直接计算
使用图形用户界面编写一个小学生整数四则运算练习软件。程序启动后,用户输入用户名,然后选择做什么运算(加、减、乘、除、混合)、做几位数的运算,再单击“开始做题”,之后计算机按要求随机生成10道题目,用户...
求一个简单的JAVA四则运算的程序,只要能进行四则运算就可以了
接下来,我们要在`ComplexNumber`类中定义四个方法来实现四则运算。每个方法将接收另一个`ComplexNumber`对象作为参数,并返回一个新的`ComplexNumber`对象,表示运算结果。 1. 加法: ```java public Complex...
在实现四则运算器时,我们通常会创建一个方法(如`calculate()`),该方法接收两个数字和一个运算符作为参数,然后根据运算符返回计算结果。为了处理除法时可能出现的除零错误,我们需要使用`try-catch`语句来捕获`...
计算器的实现 算法题 逆波兰表达式实现优先级判断
基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业设计任务书.docx基于java的四则运算计算器设计与实现毕业...
总的来说,这个项目通过Java实现了一个基础的四则运算系统,包括了基本的运算逻辑、控制流程、用户交互以及可能的扩展功能。对于初学者来说,这是一个很好的练习,涵盖了编程基础、控制流、异常处理以及对象导向编程...
Java 实现自动生成四则运算实验报告主要涵盖了以下几个方面的知识点: 1. **命令行参数处理**:通过-n 和-r 参数来控制生成题目的数量和数值范围。在Java中,可以使用`java.util.Scanner`类从命令行读取参数,或者...
以上就是使用Java实现四则运算的基本思路和关键步骤,实际编程时应确保代码的健壮性和错误处理,避免出现未捕获的异常,同时对于复杂的表达式,可能需要引入更复杂的解析算法,如递归下降解析。
该资源为基于Java的四则运算练习系统,用户可以在该系统进行练习,考试,查看错题,和进行算法小游戏。练习和考试可以选择难度,通过考试后会提升自己的能力等级,解锁更高难度的测试。练习和考试中错的题目将记载入...
本次实验采用结对编程方式,设计开发一个小学生四则运算练习软件,使之具有以下功能: 由计算机从题库文件中随机选择 20 道加减乘除混合算式,用户输入算式答案,程序检查答案是否正确,每道题正确计 5 分,错误不...