Python实现PEMDAS括号运算 无正则场景下代码修复问题
PEMDAS计算器括号处理逻辑修复问题
我正在开发符合PEMDAS运算规则的计算函数,目前EMDAS相关运算逻辑已运行正常,仅需修正括号处理逻辑即可完成整体功能。
当前编写的paren函数可正常处理两类场景:
- 嵌套括号场景:输入
(1+(1+1))可正确输出1+(1+1) - 多个独立括号场景:输入
(1+1) + (2+2)可正确输出第一个括号内的1+1以便优先计算
但代码无法处理嵌套括号与独立括号的组合场景,输入(1+(1+1)) + (1+1)时期望输出1+(1+1),实际输出为1+(1+1)) + (1+1,要求不能使用正则表达式。
原有问题代码
def paren(equation): for i in range(len(equation)): if equation[i] == "(": for j in range(i + 1, len(equation)): if equation[j] == ')': return equation[i + 1:j] elif equation[j] == '(': for x in range(len(equation) - 1, -1, -1): if equation[x] == ')': return equation[i + 1:x] else: continue
测试用例说明
- 输入1:
(1+(1+1)),期望输出1:1+(1+1) - 输入2:
(1+1) + (2+2),期望输出2:1+1(输出第一个括号内的表达式优先计算) - 输入3:
(1+(1+1)) + (1+1),期望输出3:1+(1+1),实际输出3:1+(1+1)) + (1+1
修复方案
原有代码的核心问题是遇到嵌套括号时直接从整个字符串末尾倒找右括号,没有区分当前括号对和后续独立括号的边界,正确逻辑采用括号计数法匹配第一个左括号对应的闭合右括号即可:
- 定位第一个左括号的起始位置
- 初始化括号计数器为1,从左括号下一位开始遍历
- 每遇到左括号计数器+1,每遇到右括号计数器-1
- 计数器归0时当前位置就是匹配的闭合右括号,直接截取中间内容
修复后代码
def paren(equation): # 查找第一个左括号位置 start = equation.find('(') if start == -1: return "" bracket_count = 1 # 遍历查找匹配的闭合右括号 for i in range(start + 1, len(equation)): if equation[i] == '(': bracket_count += 1 elif equation[i] == ')': bracket_count -= 1 if bracket_count == 0: return equation[start+1:i] # 括号不匹配的异常场景返回空 return ""
验证结果
三个测试用例全部符合预期:
- 输入
(1+(1+1))返回1+(1+1) - 输入
(1+1) + (2+2)返回1+1 - 输入
(1+(1+1)) + (1+1)返回1+(1+1)
内容的提问来源于stack exchange,提问作者starshine
相关产品推荐
相关产品推荐

