首页 > 编程语言 >如何合并数字与运算符数组并顺序计算表达式

如何合并数字与运算符数组并顺序计算表达式

来源:互联网 2026-07-12 08:11:01

一种将数字字符串与运算符列表合并、按从左到右顺序逐次计算的方法,适用于简易计算器场景。该方法忽略算术优先级,通过线性遍历实现,并提供Java代码及关键注意事项,包括输入校验、列表可变性和浮点精度问题。

本文介绍一种将分离存储的数字字符串列表和运算符字符串列表合并,并按从左到右顺序(不考虑优先级)进行逐次计算的方法,适用于简易计算器场景,提供可直接运行的 Java 实现及关键注意事项。

实现方法

说到简易计算器的实现,一个很常见的场景是:用户输入被拆成两个独立的序列——数字列表(比如 "10", "5", "3", "2")和运算符列表(比如 "+", "*", "-")。如果真想搞标准数学优先级(先乘除后加减),那得搞表达式树或者逆波兰转换,逻辑相对复杂。但很多轻量级场景下,需求其实很简单:严格从左到右算,也就是 ( (10 + 5) * 3 ) - 2 = 43。这种场景下,用线性遍历就能搞定,代码清爽不少。

下面这个 Java 方法就是专为这种“左结合”顺序计算设计的,直接拿来用就行:

长期稳定更新的攒劲资源: >>>点此立即查看<<<

import ja va.util.*;

/**
 * 按从左到右顺序计算表达式:result = (((n op n) op n) op n) ...
 * 注意:postNumbers 必须为可修改列表(如 ArrayList),因首元素被移除作为初始值
 */
public static double evaluate(List postNumbers, List postOperators) {
    if (postNumbers == null || postOperators == null) {
        throw new IllegalArgumentException("输入列表不能为 null");
    }
    if (postNumbers.isEmpty()) {
        throw new IllegalArgumentException("数字列表不能为空");
    }
    if (postOperators.size() != postNumbers.size() - 1) {
        throw new IllegalArgumentException(
            "运算符数量必须等于数字数量减一(当前:数字=" + postNumbers.size() +
            ", 运算符=" + postOperators.size() + ")"
        );
    }

    double result = Double.parseDouble(postNumbers.remove(0)); // 取第一个数字作为起点
    for (int i = 0; i < postNumbers.size(); i++) {
        double value = Double.parseDouble(postNumbers.get(i));
        String opStr = postOperators.get(i);
        if (opStr.length() != 1) {
            throw new IllegalArgumentException("运算符必须为单字符:" + opStr);
        }
        char operator = opStr.charAt(0);
        result = switch (operator) {
            case '+' -> result + value;
            case '-' -> result - value;
            case '*' -> result * value;
            case '/' -> {
                if (value == 0.0) throw new ArithmeticException("除零错误");
                yield result / value;
            }
            default -> throw new IllegalArgumentException("不支持的运算符:" + operator);
        };
    }
    return result;
}

使用示例

List numbers = new ArrayList<>(Arrays.asList("10", "5", "3", "2"));
List operators = List.of("+", "*", "-");
double result = evaluate(numbers, operators); // 返回 43.0
System.out.println(result); // 输出:43.0

注意事项

顺序即规则

这个方法就是死磕“左结合”,完全不理会标准的算术优先级。如果你需要 10 + 5 * 3 先算乘法,那这条路走不通,得换成中缀转后缀或者递归下降解析器。

输入校验不能省

代码里已经做了空值、长度匹配、除零、非法字符检查。生产环境里这些校验最好都保留,不然线上出 bug 查起来很头疼。

数字列表必须可变

因为第一行就把第一个元素 remove 掉了,所以传进来的列表得是 ArrayList 这种支持删除的。如果你不想改原始数据,记得先 copy 一份:new ArrayList<>(originalNumbers)

浮点精度要小心

Double.parseDouble() 会引入 IEEE 754 的浮点误差。对精度要求高的场景(比如金融计算),建议换成 BigDecimal 并自己实现运算逻辑。

总的来说,这个方案用最小的复杂度解决了“顺序计算”的核心需求,代码结构清晰,调试和扩展都很方便。对于轻量级计算器来说,是个很理想的选择。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。