`

Java实现四则运算的解析收藏

阅读更多
前些天,在项目里面在做OLAP模块,其中一个自定义配置部分,里面需要用到根据配置的四则运算公式(字符串型),计算公式的结果。
于是在网上搜索了一番,终于有所启发。但是也感慨网上很多的例子并不完整,让我冒着访问恶意网页的风险,四处浏览。遂将我自己的实现写在这里,供大家参考讨论。
此实现方法主要是参考了机械工业出版社出版的《数据结构、算法与应用——C++语言描述》(2000年1月出版)当中,第5章——堆栈,第169页,5.5应用——5.5.1括号匹配的例子,使用Java编写完成。
JVM版本为JDK6 Update1.
因为在处理四则运算的时候最麻烦的逻辑主要是对括号内预算的处理,特别是括号的嵌套。
因此该算法主要的逻辑是,通过对括号位置的观察,得出:从左至右的扫描一个字符串,那么每一个右括号将与最近遇到的那个未匹配的左括号相匹配。这和堆栈的后进先出的规则是一样的。因此得到在扫描的过程当中,将每一个遇到的左括号进行压栈,在出现右括号的时候,出栈。
该解法相对于通过递归实现的解法,在时间复杂性上略好,并且实现出来的代码更加清晰。
以下为具体实现的代码:
package azurecube.common;
import java.util.LinkedList;
import java.util.ArrayList;
public class FormulaCalculator {
 private boolean isRightFormat = true;
 
 public double getResult(String formula){
  double returnValue = 0;
  try{
   returnValue = doAnalysis(formula);
  }catch(NumberFormatException nfe){
   System.out.println("公式格式有误,请检查:" + formula);
  }catch(Exception e){
   e.printStackTrace();
  }
  if(!isRightFormat){
   System.out.println("公式格式有误,请检查:" + formula);
  }
  return returnValue;
 }
 private double doAnalysis(String formula){
  double returnValue = 0;
  LinkedList<Integer> stack = new LinkedList<Integer>();
  
  int curPos = 0;
  String beforePart = "";
  String afterPart = "";
  String calculator = "";
  isRightFormat = true;
  while(isRightFormat&&(formula.indexOf('(') >= 0||formula.indexOf(')') >= 0)){
   curPos = 0;
   for(char s : formula.toCharArray()){
    if(s == '('){
     stack.add(curPos);
    }else if(s == ')'){
     if(stack.size() > 0){
      beforePart = formula.substring(0, stack.getLast());
      afterPart = formula.substring(curPos + 1);
      calculator = formula.substring(stack.getLast() + 1, curPos);
      formula = beforePart + doCalculation(calculator) + afterPart;
      stack.clear();
      break;
     }else{
      System.out.println("有未关闭的右括号!");
      isRightFormat = false;
     }
    }
    curPos++;
   }
   if(stack.size() > 0){
    System.out.println("有未关闭的左括号!");
    break;
   }
  }
  if(isRightFormat){
   returnValue = doCalculation(formula);
  }
  return returnValue;
 }
 private double doCalculation(String formula) {
  ArrayList<Double> values = new ArrayList<Double>();
  ArrayList<String> operators = new ArrayList<String>();
  int curPos = 0;
  int prePos = 0;
  for (char s : formula.toCharArray()) {
   if (s == '+' || s == '-' || s == '*' || s == '/') {
    values.add(Double.parseDouble(formula.substring(prePos, curPos)
      .trim()));
    operators.add("" + s);
    prePos = curPos + 1;
   }
   curPos++;
  }
  values.add(Double.parseDouble(formula.substring(prePos).trim()));
  char op;
  for (curPos = operators.size() - 1; curPos >= 0; curPos--) {
   op = operators.get(curPos).charAt(0);
   switch (op) {
   case '*':
    values.add(curPos, values.get(curPos) * values.get(curPos + 1));
    values.remove(curPos + 1);
    values.remove(curPos + 1);
    operators.remove(curPos);
    break;
   case '/':
    values.add(curPos, values.get(curPos) / values.get(curPos + 1));
    values.remove(curPos + 1);
    values.remove(curPos + 1);
    operators.remove(curPos);
    break;
   }
  }
  for (curPos = operators.size() - 1; curPos >= 0; curPos--) {
   op = operators.get(curPos).charAt(0);
   switch (op) {
   case '+':
    values.add(curPos, values.get(curPos) + values.get(curPos + 1));
    values.remove(curPos + 1);
    values.remove(curPos + 1);
    operators.remove(curPos);
    break;
   case '-':
    values.add(curPos, values.get(curPos) - values.get(curPos + 1));
    values.remove(curPos + 1);
    values.remove(curPos + 1);
    operators.remove(curPos);
    break;
   }
  }
  return values.get(0).doubleValue();
 }
}
分享到:
评论
2 楼 future09 2011-09-16  
效率如何呀  哥们?
1 楼 zdyhlp 2011-06-28  
貌似有点问题啊:getResult("3/(5/5)*8")=0.375,应该是24.0才对啊

相关推荐

    java实现四则运算

    在Java编程语言中,实现四则运算涉及到对数学表达式的解析和计算。在这个场景下,用户可以自由输入如"2 + 3 * 4"这样的简单四则运算表达式,但不支持包含括号的复杂表达式。接下来,我们将详细讨论如何在Java中构建...

    四则运算解析器(字符串)

    在实现四则运算解析器时,可以采用递归下降解析(Recursive Descent Parsing)或者堆栈解析(Shunting Yard Algorithm,也称逆波兰表示法)等方法。递归下降解析器直接使用函数来表示文法规则,适合处理简单的表达式...

    java四则运算工具类

    解析expression四则运算表达式 如:(1+2*3.5*(2+3)-10+18*20)

    java实现字符串四则运算公式解析工具类的方法

    "java实现字符串四则运算公式解析工具类的方法" 今天小编将为大家分享java实现字符串四则运算公式解析工具类的方法,这个工具类能够帮助用户快速解析和计算字符串形式的四则运算公式。这个工具类被命名为...

    java四则运算eval.jar

    例: Expression e = new [removed]"1+2*((3+5)/10*5*4 +(1-2)/4)"); System.out.println(e.eval&#40;&#41;);//32.5 要求jdk1.6

    java控制台四则运算计算程序源码

    Java控制台四则运算计算程序源码是一种基于Java编程语言实现的简单计算器,它能够处理任意长度的符合四则运算规则的数学表达式。在控制台上进行交互式操作,用户可以输入数学公式,程序会进行解析并计算出结果。这个...

    四则运算用java实现

    以下是对标题“四则运算用java实现”及描述“自己写的一个测试过的关于四则运算的java例子,可以处理小数”的详细解析。 1. **基础语法**: Java中的四则运算符包括:`+`(加法)、`-`(减法)、`*`(乘法)和`/`...

    简单的JAVA四则运算

    #### 一、Java四则运算基础 在计算机编程中,四则运算是最基本的数学运算之一,主要包括加法(`+`)、减法(`-`)、乘法(`*`)与除法(`/`)。对于Java这样的面向对象语言而言,实现四则运算不仅涉及到基本的数据类型操作,...

    antlr实现四则运算源码

    要运行这个ANTLR4实现的四则运算解析器,你需要先安装ANTLR4工具,然后使用它将.g4文件转换为Java代码。之后,你可以编写一个主程序,加载输入的表达式,使用生成的解析器和访问者执行计算。 总的来说,ANTLR4是一...

    Java利用堆栈实现简单四则运算

    本文将详细介绍如何利用Java的堆栈数据结构来实现简单的四则运算。 四则运算,即加法(+)、减法(-)、乘法(*)和除法(/),是我们日常计算中最基本的操作。在计算机程序中,这些运算通常用于处理数学表达式。...

    java 四则运算计算器

    **标题与描述解析:**“Java四则运算计算器”是一款基于Java语言开发的计算器应用,能够执行加、减、乘、除等基本算术运算,并支持混合运算,具备友好的用户界面。描述中强调了该计算器的易用性和简洁性,适合日常...

    输入字符串实现加减乘除四则运算(java)

    将近250行的算法 实现了通过字符串进行加减乘除四则运算 纯通过处理字符串和数组实现 希望能帮助大家: 例如:String input &quot;33+26 77+70&quot;; String result &quot;&quot;; try { result Account...

    四则运算JAVA计算器

    ### 四则运算JAVA计算器知识点解析 #### 一、项目概述 该项目是一个基于Java Swing的简单计算器应用程序,能够实现基本的四则运算功能,并且支持括号操作,以解决优先级问题。为了处理复杂的数学表达式,该计算器还...

    简单的JAVA四则运算.pdf

    JAVA四则运算的实现与优化 本文将对 JAVA 四则运算的实现进行详细的分析与解释,并对代码进行逐行解释。 一、 JAVA四则运算的实现 在 JAVA 中,四则运算的实现可以使用基本的运算符和数据类型来实现。在本文中,...

    Java编写的大整数四则运算

    ### Java编写的大整数四则运算:深入解析与理解 #### 概述 在计算机科学领域,处理大整数运算是一项挑战,特别是在超出标准整数类型(如`int`或`long`)所能表达的范围时。Java语言通过内置的`BigInteger`类提供了...

    java中实现四则运算代码

    在Java编程语言中,实现四则运算涉及到将数学表达式解析、转换并计算的过程。这里主要涉及两个关键步骤:1) 将中缀表达式(常见的运算符在操作数之间的形式)转换为后缀表达式(也称为逆波兰表示法,运算符在操作数...

    基于SLR文法的整数加减乘除四则运算

    在这个“基于SLR文法的整数加减乘除四则运算”项目中,我们主要关注的是如何用SLR方法解析和执行基本的算术表达式,即整数之间的加、减、乘、除操作。这通常涉及到以下步骤: 1. **文法定义**:首先,我们需要定义...

    Java综合程序设计——计算器(实现运算符优先级的四则混合运算)

    在本项目中,"Java综合程序设计——计算器(实现运算符优先级的四则混合运算)"是一个典型的软件开发任务,旨在实现一个功能丰富的计算器,包括基础的四则运算以及更复杂的数学操作如对数和平方根。这个计算器的关键...

    javascript中解析四则运算表达式的算法和示例

    在编写代码时我们有时候会碰到需要自己解析四则运算表达式的情况,本文简单的介绍使用JavaScript实现对简单四则运算表达式的解析。 一、熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, ...

    人工智能四则运算手写体识别训练模型

    本文将深入探讨一款专门针对四则运算手写体进行识别训练的人工智能模型。 首先,我们要理解该模型的核心任务是处理图像数据,并实现对数字与运算符号的精确识别。这一过程涉及到复杂的图像处理和模式识别技术。手写...

Global site tag (gtag.js) - Google Analytics