如何合并数字与操作数数组,按顺序实现计算器运算?
顺序运算计算器的实现方案
一、合并两个列表为表达式序列
完全可以将数字列表和操作符列表交替合并为一个序列,合并逻辑很简单:依次将数字和对应操作符加入新列表,最后以数字结尾(合法输入中数字数量比操作符多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,避免出现连续操作符导致的越界或计算错误;
- 索引逻辑:遍历操作符时,对应的下一个数字索引应为
i+1(而非与操作符同索引),确保每个操作符都能匹配到正确的后续数字。
内容的提问来源于stack exchange,提问作者ChackoNorris
相关产品推荐
相关产品推荐

