游乐游手机版
首页/编程语言/文章详情

两个数组合并后按顺序执行四则运算的方法

时间:2026-07-15 18:51
将数字与运算符分别存储在两个列表中,按从左到右顺序依次执行四则运算(不考虑优先级),适用于简易计算器场景。该方法实现简单,直接遍历列表计算,支持加减乘除,并提供可直接运行的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 numbers, List 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 < operators.size(); i++) {
            double nextNum = Double.parseDouble(numbers.get(i + 1));
            char op = operators.get(i).charAt(0);
            switch (op) {
                case '+': result += nextNum; break;
                case '-': result -= nextNum; break;
                case '*': result *= nextNum; break;
                case '/':
                    if (Math.abs(nextNum) < 1e-10) {
                        throw new ArithmeticException("Division by zero");
                    }
                    result /= nextNum;
                    break;
                default:
                    throw new IllegalArgumentException("Unsupported operator: " + op);
            }
        }
        return result;
    }

    // 使用示例
    public static void main(String[] args) {
        List postNumbers = new ArrayList<>(Arrays.asList("10", "5", "3", "2"));
        List postOperators = List.of("+", "*", "-");
        double result = evaluate(postNumbers, postOperators);
        System.out.println(result); // 输出:43.0
    }
}

关键设计说明

  • 初始值取第一个数字,后续每一轮都用当前结果与下一个数字按对应运算符进行运算,实现高效迭代;
  • 运算符列表长度必须严格等于数字列表长度减一,否则逻辑失效——该校验已在代码中显式处理,增强鲁棒性;
  • 对除零、非法运算符及输入边界均做了显式校验,有效提升代码的健壮性与可维护性;
  • 不支持括号或优先级——如需标准数学表达式解析(例如 10+5*3-2 应得到 23.0),则需改用中缀转后缀(逆波兰)或递归下降解析器等高级方案。

来源:https://www.php.cn/faq/2812619.html
上一篇Golang系统部署Twilio实现微服务安全手机黑名单阻断 下一篇如何利用Python Scrapy结合Splash渲染复杂动态网页详细教程
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Linux route命令详解:查看与修改IP路由表
编程语言 · 2026-07-15

Linux route命令详解:查看与修改IP路由表

route命令源自net-tools工具包,用于查看和修改Linux内核IP路由表,但自2009年起已废弃,现代推荐使用iproute命令。由于历史惯性,route仍在生产环境大量存在,且仅能操作main表,需注意新发行版默认未安装。

Python部署Scikit-learn模型为FastAPI微服务
编程语言 · 2026-07-15

Python部署Scikit-learn模型为FastAPI微服务

部署Scikit-learn模型为FastAPI微服务时,需用joblib加载模型,请求体应为二维数组,并添加输入校验(类型转换、维度检查、NaN过滤),生产环境使用uvicorn多worker启动,配合错误处理与日志记录,确保服务稳定高效。

CentOS系统中实现Golang日志自动轮转的配置方法
编程语言 · 2026-07-15

CentOS系统中实现Golang日志自动轮转的配置方法

在CentOS上使用logrotate管理Golang应用日志轮转:安装后编写配置文件,设置每天轮转、保留7份、压缩、不处理空日志,创建新日志权限640;手动测试配置无误后通过cron每日自动执行,实现日志按天切分、压缩与清理。

如何高效解决SQL中IN子句超过1000个元素的限制
编程语言 · 2026-07-15

如何高效解决SQL中IN子句超过1000个元素的限制

针对Oracle等数据库IN子句1000项上限,可通过子查询、分批执行、EXISTS关联子查询等方案突破限制,兼顾查询性能与可维护性,避免字符串拼接反模式,同时提升SQL灵活性与数据库兼容性。

CentOS Java日志记录速度优化与性能提升指南
编程语言 · 2026-07-15

CentOS Java日志记录速度优化与性能提升指南

在CentOS环境下优化Java日志记录速度,需采用Log4j2异步日志解耦业务线程,生产环境日志级别设为WARN或ERROR,配合日志轮转与SSD存储;调整缓冲区大小、简化格式化、优化JVM堆与GC策略,并利用无锁设计避免锁竞争。通过监控工具定位瓶颈,分布式系统可引入集中式日志收集。