如何在Kotlin中不依赖外部库实现字符串数学运算求值?
无括号四则运算求值实现方案
针对你已经移除括号后的基础表达式,可通过先处理乘除、再处理加减的两步策略实现求值,无需依赖任何外部库,以下是具体实现思路和代码示例:
核心思路
- 拆分表达式:将字符串拆解为包含数字和运算符的列表,方便后续遍历计算
- 优先处理乘除:遍历列表,遇到
*或/时立即计算相邻数字的结果,并用结果替换原有的"数字-运算符-数字"组合 - 顺序处理加减:乘除处理完成后,列表仅剩数字和
+/-,从左到右依次计算最终结果
具体实现(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
相关产品推荐
相关产品推荐

