资讯专栏INFORMATION COLUMN

字符串的四则运算表达式

chnmagnus / 613人阅读

摘要:支持括号小数负数也行运算数字运算符没有括号正常运算括号内的值都取完了,删除括号左右括号齐全先算括号内的一个包含数字的列表和一个包含运算符的列表形式可能会有空字符串符号列表同时出现从左至右运算同时出现从左

    public static void main(String[] args) {
        // 支持括号 小数 负数
        String statement = "-10/(4.5+5.5)*(-4-6+20)/-2"; // 10/(-2) 也行
        System.out.println(calculate(statement));
    }

    @SuppressWarnings("unchecked")
    private static double calculate(String statement){
        Object[] result = filter(statement);
        // 运算数字
        List numList = (List) result[0];
        // 运算符
        List symbolList = (List) result[1];
        while (!symbolList.isEmpty()) {
            int index = symbolList.indexOf("(");
            if (index == -1) {
                // 没有括号正常运算
                realCalculate(numList, symbolList);
            } else {
                int right = symbolList.indexOf(")");
                if (right == index + 1) {
                    // 括号内的值都取完了,删除括号
                    symbolList.remove(index);
                    symbolList.remove(index);
                    continue;
                }
                // 左右括号齐全 先算括号内的
                if (right != -1) {
                    List doubles = numList.subList(index, right);
                    List subChars = symbolList.subList(index + 1, right);
                    realCalculate(doubles, subChars);
                }
            }
        }
        return numList.get(0);
    }

    /**
     * @return 一个包含数字的列表和一个包含运算符的列表
     */
    private static Object[] filter(String statement) {
        // 形式 123,456,789 可能会有空字符串
        StringBuilder nums = new StringBuilder();
        // 符号列表
        List symbolList = new LinkedList<>();
        for (int i = 0; i < statement.length(); i++) {
            char c = statement.charAt(i);
            if (c == "-" && (i == 0 || statement.charAt(i - 1) == "(" 
            || statement.charAt(i - 1) == "*" || statement.charAt(i - 1) == "/")) {
                nums.append(c).append(statement.charAt(i + 1));
                i++;
            } else if (Character.isDigit(c) || c == ".") {
                nums.append(c);
            } else {
                symbolList.add(c);
                nums.append(",");
            }
        }

        String[] ss = nums.toString().split(",");
        List numList = new ArrayList<>();
        for (String num : ss) {
            if (!num.isEmpty()) {
                numList.add(Double.parseDouble(num));
            }
        }
        return new Object[]{numList, symbolList};
    }

    private static void realCalculate(List numList, List symbolList) {
        while (!symbolList.isEmpty()) {
            int index = symbolList.indexOf("*"), tmp;
            double value = 0.0D;
            if (index != -1 && (tmp = symbolList.indexOf("/")) != -1) {
                // 同时出现 * / 从左至右运算
                if (index < tmp) {
                    value = numList.remove(index) * numList.remove(index);
                } else {
                    index = tmp;
                    value = numList.remove(index) / numList.remove(index);
                }
            } else if (index != -1) {
                value = numList.remove(index) * numList.remove(index);
            } else if ((index = symbolList.indexOf("/")) != -1) {
                value = numList.remove(index) / numList.remove(index);
            } else if ((index = symbolList.indexOf("+")) != -1 && (tmp = symbolList.indexOf("-")) != -1) {
                // 同时出现 + - 从左至右运算
                if (index < tmp) {
                    value = numList.remove(index) + numList.remove(index);
                } else {
                    index = tmp;
                    value = numList.remove(index) - numList.remove(index);
                }
            } else if (index != -1) {
                value = numList.remove(index) + numList.remove(index);
            } else if ((index = symbolList.indexOf("-")) != -1) {
                value = numList.remove(index) - numList.remove(index);
            }
            // 删除运算符
            symbolList.remove(index);
            // 将计算结果放回列表,待下次计算
            numList.add(index, value);
        }
    }
总结一下

我的方法是先从括号的算起,根据运算符索引查找运算数索引,从而进行计算,算完后删除运算符和运算数,并将运算结果放回待运算的列表

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75051.html

相关文章

  • Javascript语句 - Javascript语法基础 - Javascript核心

    摘要:多数运算符都是由标点符号表示,比如和。通常会根据需要对操作数进行类型转换左值是一个古老的属于,它是指表达式只能出现在赋值运算符的左侧。也称为严格相等运算符,它用来检测两个操作数是否严格相等。运算符的检测规则是和运算符的求反。 源代码: https://github.com/RobinQu/Programing-In-Javascript/blob/master/chapters/...

    lavnFan 评论0 收藏0
  • js-数据运算

    摘要:跳过第二个运算子的机制,被称为短路有些程序员喜欢用它取代结构等价于运算符可以多个连用返回第一个布尔值为的表达式的值。 一、运算符概述 1、定义 JavaScript中运算符主要用于连接简单表达式,组成一个复杂的表达式 2、运算符类别 算数运算符 赋值表达式 比较表达式 布尔运算符 位运算符 二、算数运算符 1、加法运算符(Addition):x + y 加法运算符是在运行时决定,到...

    sf190404 评论0 收藏0
  • JS语言核心——“表达运算符”

    摘要:原始表达式直接量保留字变量原始表达式表达式的最小单位表达式中的短语,解释器会将其计算为一个结果对象和数据的初始化表达式对象直接量和数组直接量,它们和布尔直接量不同,它们不是原始表达式函数定义表达式函数直接量也不是原始表达式属性访问表达式语法 1 原始表达式 直接量、保留字、变量 原始表达式(primary expression):表达式的最小单位 表达式:JavaScript中的短语...

    李增田 评论0 收藏0
  • JS基础学习03「表达运算符」

    摘要:函数定义表达式。对象创建表达式。需要注意的是,大多数运算符都是由标点符号表示的,比如和。也就是说,空字符串将被当作,布尔值将被当作。对于和,则分别调用函数并取得字符串和。 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。JavaScript 表达式主要有以下几种形式: 原始表达式:常量、变量、保留字。 对象、数组初始...

    dcr309duan 评论0 收藏0
  • 《JavaScript 闯关记》之表达运算

    摘要:函数定义表达式。对象创建表达式。也就是说,空字符串将被当作,布尔值将被当作。如果有一个操作数是对象数值或布尔值,则调用它们的方法取得相应的字符串值,然后再应用前面关于字符串的规则。对于和,则分别调用函数并取得字符串和。 表达式 表达式是由数字、运算符、数字分组符号(如括号)、自由变量和约束变量等以能求得数值的有意义排列方法所得的组合。JavaScript 表达式主要有以下几种形式: ...

    Render 评论0 收藏0
  • python基础教程:运算对象、运算符、表达和语句

    摘要:用一行表示它们的关系就是运算对象运算符表达式语句运算对象和运算符构成表达式,表达式构成语句运算对象运算对象就是由各种对象构成的集合,这些对象里面有些是常量,有些是变量。 编程的本质就是数据和运算,数据由基本数据类型、数据结构来表示,运算就是对这些数据的各种操作,基本的加减乘除、是非判断、流程控制等等。这些操作就是今天我们要讲的运算符、表达式和语句。 showImg(http://upl...

    stdying 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<