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

如何在Kotlin中不依赖外部库实现字符串数学运算求值?

无括号四则运算求值实现方案

针对你已经移除括号后的基础表达式,可通过先处理乘除、再处理加减的两步策略实现求值,无需依赖任何外部库,以下是具体实现思路和代码示例:

核心思路

  1. 拆分表达式:将字符串拆解为包含数字和运算符的列表,方便后续遍历计算
  2. 优先处理乘除:遍历列表,遇到*或/时立即计算相邻数字的结果,并用结果替换原有的"数字-运算符-数字"组合
  3. 顺序处理加减:乘除处理完成后,列表仅剩数字和+/-,从左到右依次计算最终结果

具体实现(Python)

def calculate(expr):
    # 1. 拆分表达式为数字与运算符的列表(支持多位数)
    tokens = []
    current_num = ""
    for c in expr:
        if c in "+-*/":
            if current_num:
                tokens.append(float(current_num))
                current_num = ""
            tokens.append(c)
        else:
            current_num += c
    if current_num:
        tokens.append(float(current_num))
    
    # 2. 处理所有乘除运算
    idx = 1
    while idx < len(tokens):
        op = tokens[idx]
        if op in "*/":
            left_val = tokens[idx-1]
            right_val = tokens[idx+1]
            # 计算结果
            if op == "*":
                result = left_val * right_val
            else:
                if right_val == 0:
                    raise ValueError("无法进行除零运算")
                result = left_val / right_val
            # 替换原三个元素为计算结果
            tokens = tokens[:idx-1] + [result] + tokens[idx+2:]
            idx -= 1  # 回退索引,避免跳过下一个运算符
        idx += 1
    
    # 3. 处理剩余加减运算
    final_result = tokens[0]
    for idx in range(1, len(tokens), 2):
        op = tokens[idx]
        num = tokens[idx+1]
        if op == "+":
            final_result += num
        else:
            final_result -= num
    return final_result

# 测试你的示例表达式
test_expr = "6+4/2-1*0"
print(calculate(test_expr))  # 输出 8.0(若需整数结果可转int)

注意事项

  • 多位数支持:代码自动处理连续数字字符,可正确解析"123+45*6"这类表达式
  • 负数兼容:若表达式包含开头负数(如"-6+3*2"),需调整拆分逻辑,将开头负号与后续数字合并为负数值
  • 除零防护:代码加入了除零判断,避免运行时错误
  • 精度控制:使用float处理数字,如需整数运算可将float替换为int(注意除法需用//并处理整除逻辑)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:20:35