You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并数字与操作数数组,按顺序实现计算器运算?

顺序运算计算器的实现方案

一、合并两个列表为表达式序列

完全可以将数字列表和操作符列表交替合并为一个序列,合并逻辑很简单:依次将数字和对应操作符加入新列表,最后以数字结尾(合法输入中数字数量比操作符多1)。

Java代码示例:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class CalculatorMerge {
    public static void main(String[] args) {
        List<String> postNumbers = Arrays.asList("10", "5", "3", "2");
        List<String> postOperands = Arrays.asList("+", "*", "-");
        List<String> mergedSequence = new ArrayList<>();

        // 交替合并数字与操作符
        for (int i = 0; i < postNumbers.size(); i++) {
            mergedSequence.add(postNumbers.get(i));
            // 操作符数量比数字少1,仅当不是最后一个数字时添加操作符
            if (i < postOperands.size()) {
                mergedSequence.add(postOperands.get(i));
            }
        }

        // 输出合并后的序列:["10", "+", "5", "*", "3", "-", "2"]
        System.out.println(mergedSequence);
    }
}

二、基于序列完成顺序运算

按操作数顺序运算(从左到右依次计算,不考虑运算符优先级)的核心逻辑是:用一个变量保存当前计算结果,初始化为第一个数字,然后遍历每个操作符和对应的下一个数字,逐步更新结果。

直接用原列表运算(无需合并)

这种方式更高效,不需要额外的合并步骤:

import java.util.Arrays;
import java.util.List;

public class CalculatorCompute {
    public static void main(String[] args) {
        List<String> postNumbers = Arrays.asList("10", "5", "3", "2");
        List<String> postOperands = Arrays.asList("+", "*", "-");
        double result;

        // 先校验输入合法性:数字数量必须比操作符多1
        if (postNumbers.size() != postOperands.size() + 1) {
            throw new IllegalArgumentException("输入格式错误:数字与操作符数量不匹配");
        }

        // 初始化结果为第一个数字
        result = Double.parseDouble(postNumbers.get(0));

        // 遍历操作符,依次计算
        for (int i = 0; i < postOperands.size(); i++) {
            String op = postOperands.get(i);
            double nextNum = Double.parseDouble(postNumbers.get(i + 1));

            switch (op) {
                case "+":
                    result += nextNum;
                    break;
                case "-":
                    result -= nextNum;
                    break;
                case "*":
                    result *= nextNum;
                    break;
                case "/":
                    if (nextNum == 0) {
                        throw new ArithmeticException("除数不能为0");
                    }
                    result /= nextNum;
                    break;
                default:
                    throw new IllegalArgumentException("不支持的操作符:" + op);
            }
        }

        // 输出结果:43.0(10+5=15,15*3=45,45-2=43)
        System.out.println("运算结果:" + result);
    }
}

基于合并后的序列运算

如果一定要用合并后的序列计算,逻辑类似,通过步长为2的循环遍历序列即可:

double result = Double.parseDouble(mergedSequence.get(0));
// 每次跳过一个元素(操作符+数字为一组)
for (int i = 1; i < mergedSequence.size(); i += 2) {
    String op = mergedSequence.get(i);
    double nextNum = Double.parseDouble(mergedSequence.get(i + 1));
    // 同上switch运算逻辑
}

三、解决连续操作符的问题

你之前遇到的连续加号/斜杠无法正常工作的问题,大概率是循环索引处理错误或输入合法性校验缺失:

  1. 输入合法性校验:必须确保数字列表长度 = 操作符列表长度 + 1,避免出现连续操作符导致的越界或计算错误;
  2. 索引逻辑:遍历操作符时,对应的下一个数字索引应为i+1(而非与操作符同索引),确保每个操作符都能匹配到正确的后续数字。

内容的提问来源于stack exchange,提问作者ChackoNorris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 19:02:11