
本文介绍一种将数字与运算符分别存储在两个列表中,再按从左到右顺序(不考虑优先级)依次计算的简洁实现方法,适用于简易计算器场景,并提供可直接运行的 java 示例代码。
本文介绍一种将数字与运算符分别存储在两个列表中,再按从左到右顺序(不考虑优先级)依次计算的简洁实现方法,适用于简易计算器场景,并提供可直接运行的 java 示例代码。
在构建基础计算器时,常需将用户输入的数字和运算符分离处理——例如将 "10+5*3-2" 拆解为数字列表 ["10", "5", "3", "2"] 和运算符列表 ["+", "*", "-"]。注意:此处采用严格从左到右顺序计算(即不遵循乘除优先规则),等价于 ( (10 + 5) * 3 ) - 2 = 43.0,这正是所谓“操作数按序计算”(operands in order)的核心逻辑。
以下是推荐的 Java 实现方案:
import java.util.*;
public class SimpleCalculator {
/**
* 按从左到右顺序计算:result = ((num0 op0 num1) op1 num2) op2 num3 ...
* @param numbers 非空数字字符串列表(至少含1个元素)
* @param operators 运算符列表,长度应为 numbers.size() - 1
* @return 计算结果
*/
public static double evaluate(List<string> numbers, List<string> operators) {
if (numbers.isEmpty()) throw new IllegalArgumentException("Numbers list cannot be empty");
if (operators.size() != numbers.size() - 1) {
throw new IllegalArgumentException("Operators count must be exactly numbers count minus one");
}
double result = Double.parseDouble(numbers.get(0));
for (int i = 0; i postNumbers = new ArrayList(Arrays.asList("10", "5", "3", "2"));
List<string> postOperators = List.of("+", "*", "-");
double result = evaluate(postNumbers, postOperators);
System.out.println(result); // 输出:43.0
}
}</string></string></string>
✅ 关键设计说明:
- 初始值取第一个数字,后续每轮用当前结果与下一个数字按对应运算符运算;
- 运算符列表长度必须等于数字列表长度减一,否则逻辑失效;
- 显式校验除零、非法运算符及输入边界,提升鲁棒性;
- 不支持括号或优先级——若需标准数学表达式解析(如 10+5*3-2=23.0),应改用中缀转后缀(逆波兰)或递归下降解析器。
? 提示:该方法适合教学级计算器、命令行简易工具或作为表达式求值的起点;生产环境建议使用 javax.script.ScriptEngine 或成熟库(如 exp4j)处理复杂表达式。











