`

表达式计算器

    博客分类:
  • 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", "")));
        }
    }


}

 

分享到:
评论

相关推荐

    表达式计算器C语言版

    《C语言实现的表达式计算器》 在编程领域,实现一个表达式计算器是一项基础而重要的任务,它能够解析用户输入的数学表达式并计算出结果。在这个案例中,我们讨论的是一个采用C语言编写的表达式计算器,它具有处理...

    C#表达式计算器代码

    在本文中,我们将深入探讨如何实现一个C#表达式计算器,该计算器能够处理复杂的数学表达式并计算出正确的结果。这个程序的关键在于理解和处理运算符的优先级,并使用合适的数据结构来有效地执行计算。 首先,我们...

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

    标题 "简单的LISP算术表达式计算器" 涉及的核心技术是LISP语言和计算器的设计,这通常是一个计算机科学教育中的课程设计项目。LISP(LISt Processing)是一种古老而强大的编程语言,以其独特的括号表示法和对递归的...

    C#写的表达式计算器

    《C#实现的表达式计算器深度解析》 在编程领域,计算器程序是一个常见的学习和实践项目,它能够帮助我们理解语言的基本语法、控制流程以及数据处理。本文将深入探讨一个用C#编写的表达式计算器,它不仅具备基础的四...

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

    在编程领域,设计一个表达式计算器是一项常见的任务,它能够解析和计算数学表达式。本项目专注于使用C#语言实现一个基于栈架构的表达式计算器。栈是一种特殊的数据结构,具有后进先出(LIFO)的特点,非常适合处理逆...

    超越表达式计算器

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

    简单LISP算术表达式计算器

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

    C# 数值表达式计算器

    在本文中,我们将深入探讨如何使用C#语言创建一个数值表达式计算器,它能够处理基本的加、减、乘、除运算以及小数运算。这个计算器项目的核心是使用栈(Stack)数据结构来解析和计算数学表达式。下面将详细阐述相关...

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

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

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

    根据提供的文件信息,我们可以从标题、描述以及部分代码中提炼出与Java实现的表达式计算器相关的知识点。 ### 表达式计算器源代码 Java实现 #### 1. 项目概述 这是一个基于Java Swing的图形界面计算器应用程序。...

    在VB下的表达式计算器

    在VB(Visual Basic)下开发一个表达式计算器是一项常见的编程任务,它可以帮助用户直接输入数学公式进行计算。这个工具在教育、科学计算以及日常编程中都有广泛的应用。下面我们将详细探讨如何实现这样的计算器,...

    JAVA表达式计算器代码

    【JAVA表达式计算器代码】是一种实现数学表达式计算的程序,它可以接受用户输入的复杂算术表达式,并根据运算符的优先级正确地计算出结果。这个程序的核心思想是运用了计算机科学中的数据结构——队列,以及控制流程...

    编译型复数表达式计算器

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

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

    在这个场景下,我们讨论的是一个基于面向对象技术实现的表达式计算器。表达式计算器是计算机科学中常见的概念,它的主要功能是接收数学表达式,然后进行解析和计算,最终返回结果。 在面向对象的设计中,表达式...

    表达式计算器(java)

    在Java编程语言中,创建一个表达式计算器是一项常见的任务,它可以帮助我们解析和评估数学或逻辑表达式。这个“表达式计算器(java)”项目显然旨在实现这样的功能,允许用户输入各种数学表达式并准确计算结果。下面...

    表达式计算器附带源码

    表达式计算器,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...

    函数表达式计算器Expression Calculator

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

    易语言 四则表达式计算器源码 支持加减乘除括号运算

    在给定的标题“易语言 四则表达式计算器源码 支持加减乘除括号运算”中,我们可以看出这是一个使用易语言编写的计算器程序,它具有处理四则运算(加、减、乘、除)以及括号运算的能力。这样的计算器程序通常用于基础...

    java实现的表达式计算器

    本文将深入探讨一个基于Java实现的表达式计算器项目,旨在帮助开发者理解如何在Java环境中设计和实现一个能解析并计算数学表达式的程序。 首先,我们来看“java实现的表达式计算器”这个标题,它揭示了我们的任务是...

Global site tag (gtag.js) - Google Analytics