`

表达式计算器

    博客分类:
  • java
阅读更多
package scan.util;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class CalcUtil {

    private static Pattern p = Pattern.compile("\\([\\d.+\\-*/]+\\)");

    private static List<Expression> subExpression(String expression) {
        Matcher matcher = p.matcher(expression);
        List<Expression> list = new ArrayList<>();
        while (matcher.find()) {
            list.add(new Expression(matcher.group(), matcher.start(), matcher.end()));
        }
        return list;
    }

    private static double minExpression(String expression) {
        if (expression.startsWith("(")) {
            expression = expression.substring(1);
        }
        if (expression.endsWith(")")) {
            expression = expression.substring(0, expression.length() - 1);
        }
        char[] s = expression.toCharArray();
        List<Double> numList = new ArrayList<>();
        List<Character> calcList = new ArrayList<>();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length; i++) {
            if (('+' == s[i] || '-' == s[i] || '*' == s[i] || '/' == s[i]) && i != 0 && sb.length() > 0) {
                numList.add(Double.parseDouble(sb.toString()));
                calcList.add(s[i]);
                sb = new StringBuilder();
            } else {
                sb.append(s[i]);
            }
        }
        numList.add(Double.parseDouble(sb.toString()));
        calcList(numList, calcList, "md");
        calcList(numList, calcList, "as");
        return numList.get(0);
    }

    private static void calcList(List<Double> numList, List<Character> calcList, String op) {
        while (numList.size() > 1) {
            int i = 0;
            boolean find = false;
            for (; i < calcList.size(); i++) {
                Double result = null;
                if ("md".equals(op)) {//乘除
                    if (calcList.get(i) == '*') {
                        result = numList.get(i) * numList.get(i + 1);
                    } else if (calcList.get(i) == '/') {
                        result = numList.get(i) / numList.get(i + 1);
                    }
                } else {//加减
                    if (calcList.get(i) == '+') {
                        result = numList.get(i) + numList.get(i + 1);
                    } else if (calcList.get(i) == '-') {
                        result = numList.get(i) - numList.get(i + 1);
                    }
                }
                if (result != null) {
                    numList.remove(numList.get(i + 1));
                    numList.remove(numList.get(i));
                    numList.add(i, result);
                    find = true;
                    break;
                }
            }
            if (find) {
                calcList.remove(i);
            } else {
                break;
            }
        }
    }

    private static double calc(String expression) {
        List<Expression> list = subExpression(expression);
        if (list.isEmpty()) {
            return minExpression(expression);
        }
        StringBuilder sb = new StringBuilder();
        Expression e = null;
        int from = 0;
        for (int i = 0; i < list.size(); i++) {
            e = list.get(i);
            sb.append(safeSub(expression, from, e.start));
            sb.append(minExpression(e.expression));
            from = e.end;
        }
        sb.append(safeSub(expression, e.end, expression.length()));
        return calc(sb.toString());
    }


    private static String safeSub(String expression, int start, int end) {
        if (start < 0 || end > expression.length() || start > end)
            return "";
        return expression.substring(start, end);
    }


    static class Expression {
        String expression;
        int start;
        int end;

        public Expression(String expression, int start, int end) {
            this.expression = expression;
            this.start = start;
            this.end = end;
        }
    }


    public static void main(String[] args) {
        String[] expr = {
                "(5*(4+2)+10)/(4+2*2)"
                , "((4*(3-(-1/-1)))/5)*9"
                , "((4*(3-(-1*-1)))/5)*9"
                , "((4*(3-(-1+-1)))/5)*9"
                , "((4*(3-(-1-1)))/5)*9"
        };
        for (String e : expr) {
            System.out.println(e + " = " + calc(e.replaceAll("\\s", "")));
        }
    }


}

 

分享到:
评论

相关推荐

    超越表达式计算器

    超越表达式计算器发布啦!  这是一款有别与以往任何一款计算器软件的新型计算器软件,她使用的是独有的智能表达式分析算法,这将彻底改变您以往使用计算器的方式。 您可以直接在她的文本框中这样输入:900+644{...

    易语言源码易语言表达式计算器源码.rar

    易语言源码易语言表达式计算器源码.rar 易语言源码易语言表达式计算器源码.rar 易语言源码易语言表达式计算器源码.rar 易语言源码易语言表达式计算器源码.rar 易语言源码易语言表达式计算器源码.rar 易语言源码...

    编译型复数表达式计算器

    于是花了点时间写了个编译型的复数表达式计算器,该计算器的核心思想是对一个字符串编译一次,转换为一个计算序列,计算时不再分析字符串,直接按照计算序列计算。例如:1+2*5,可以转换为类似下面的计算序列: ...

    函数表达式计算器Expression Calculator

    函数表达式计算器是一款专门为解决复杂的表达式计算而设计的软件,功能强大,使用方便,支持多种数学函数,可进行各种表达式计算,如: -sin(1+abs(-3))-1/3+2等,将使你彻底摆脱计算时调整计算顺序的烦恼。...

    表达式计算器附带源码

    表达式计算器,Delphi开发,附带源码; 支持乘方、乘、除、取模、加、减、ABS(X)、Pow(X, Y)、Sqr(X)、Sqrt(X)、Log(Base, Exp)、Log(2, Exp)、Log(10, Exp)、Ln(X)、Ldexp、Fact、Hypot、Sin、Cos、Tan、Cotan、Sec...

    表达式计算器源代码 java实现

    用java实现的表达式计算器,可以输入计算表达式包含括号和运算符号,直接得出结果

    C#写的表达式计算器

    C#表达式计算器,能实现表达式操作,是C#写的,功能比普通计算器大

    简单LISP算术表达式计算器

    设计一个简单的LISP算术表达式计算器。简单LISP算术表达式(以下简称表达式)定义如下:(1)一个0...9的整数,或者(运算符 表达式 表达式),例如6,(+45),(+(+25)8)都是表达式,其值分别为6,9和15。...

    表达式计算器C语言版

    采用C语言编写的表达式计算器 输入表达式进行求值 支持加减乘除四则运算 支持直接在算式里输入负号 支持先乘除后加减 如输入1+3*96+5*8*9/2+37 输出506.00000

    最强命令行函数表达式计算器C源代码

    最强命令行函数表达式计算器C源代码

    在VB下的表达式计算器

    很方便的表达式计算器,可以直接输入公式计算,自己扩容函数也很方便。

    c#表达式计算器(基于栈架构)

    基于c#架构的表达式计算器,使用到栈,所以要看明白代码的话,就要稍微熟悉数据结构中栈的知识。

    JavaScript做的网页表达式计算器

    使用JavaScript做的表达式计算器 使用两个堆栈实现后缀式的转化继而计算 具体见http://blog.csdn.net/marecn/archive/2009/07/17/4356230.aspx

    简单的LISP算术表达式计算器

    一个mfc界面的 一个c的 以及本人做的一个简单lisp表达式计算器带课程设计报告 一个网上搜到的代码

    表达式计算器(java)

    用java写的表达式计算器. 可以识别多种表达式错误. 包含多个测试数据文档

    java实现的表达式计算器

    java实现的表达式计算器.小模块,可自行增强功能

    面向对象版表达式计算器之完整源码分享

    面向对象版表达式计算器的实现,见网络上资源较少,特整理处来以供大家学习,共享。

Global site tag (gtag.js) - Google Analytics