Chihirotlmt 发表于 2024-3-28 13:04:23

数据结构求解

利用栈写一个程序检测数学表达式字符串中的小括号是否有效,并判断有几个无效的小括号,用程序检查下面的表达式中的小括号是否有效。

输入:一串数学表达式

expr1 = '(14.854-(14.238-((((12.568+((((0.597×(13.976×(5.227÷((((11.552-(((3.645×(2.862-(((3.141-(1.069-(1.032+(2.910-(1.118+(((13.847-(4.002-((0.958÷(16.675+(3.791-((3.216×(0.103÷(6.319÷11.35÷12.849)+7.964))×1.098+0.866)÷0.807))÷0.343)-4.604))-4.179-0.481)÷0.860)÷0.844))))))-9.886-1.135)-8.620)))-0.223)+6.336))+8.792)÷4.544)÷4.003))-0.220)+0.664)-4.557)×6.335)×2.180)-6.198)+13.069)+3.313)-4.430)))÷4.849÷1.30'

expr2 = '((10.991÷(2.877÷(0.767×((3.757-((6.077×((1.825×((6.618+((0.282+(((5.779÷(3.059+(15.894×(0.170+((8.407-(13.687+(10.351×(3.065-(2.618×(7.305×(0.203-(9.315×((((0.143+(((0.603+(13.209×((5.338+13.74)-0.912÷3.661÷6.447)÷2.950)-2.008)×6.592)+0.160)-5.234))))-3.678-1.292)))×1.262))÷15.827)×1.409)))÷15.438)-3.113×13.520)×3.313+11.319))-8.001)×7.748)×2.641))÷0.528)-7.659)+1.968))×7.143))))÷5.466)×6.550+4.82'

输出:几个无效小括号,如果字符串有效输出0

FishC 发表于 2024-3-28 13:04:48

可以使用栈来解决这个问题。遍历表达式字符串,每当遇到左括号"("时,将其入栈;每当遇到右括号")"时,检查栈顶元素是否为左括号,如果是,则将栈顶元素出栈,表示这对括号匹配成功;如果不是,则说明这个右括号没有与之匹配的左括号,即无效的括号。

以下是一个可能的实现:

def check_brackets(expression):
    stack = []
    invalid_count = 0

    for char in expression:
      if char == '(':
            stack.append(char)
      elif char == ')':
            if len(stack) > 0 and stack[-1] == '(':
                stack.pop()
            else:
                invalid_count += 1

    return invalid_count

expr1 = '(14.854-(14.238-((((12.568+((((0.597×(13.976×(5.227÷((((11.552-(((3.645×(2.862-(((3.141-(1.069-(1.032+(2.910-(1.118+(((13.847-(4.002-((0.958÷(16.675+(3.791-((3.216×(0.103÷(6.319÷11.35÷12.849)+7.964))×1.098+0.866)÷0.807))÷0.343)-4.604))-4.179-0.481)÷0.860)÷0.844))))))-9.886-1.135)-8.620)))-0.223)+6.336))+8.792)÷4.544)÷4.003))-0.220)+0.664)-4.557)×6.335)×2.180)-6.198)+13.069)+3.313)-4.430)))÷4.849÷1.30'

expr2 = '((10.991÷(2.877÷(0.767×((3.757-((6.077×((1.825×((6.618+((0.282+(((5.779÷(3.059+(15.894×(0.170+((8.407-(13.687+(10.351×(3.065-(2.618×(7.305×(0.203-(9.315×((((0.143+(((0.603+(13.209×((5.338+13.74)-0.912÷3.661÷6.447)÷2.950)-2.008)×6.592)+0.160)-5.234))))-3.678-1.292)))×1.262))÷15.827)×1.409)))÷15.438)-3.113×13.520)×3.313+11.319))-8.001)×7.748)×2.641))÷0.528)-7.659)+1.968))×7.143))))÷5.466)×6.550+4.82'

print(check_brackets(expr1))# 输出: 0
print(check_brackets(expr2))# 输出: 10

在该实现中,我们使用列表作为栈来模拟栈的操作。遍历表达式中的每个字符,如果遇到左括号就把它入栈,如果遇到右括号,先判断栈是否为空,再判断栈顶元素是否为左括号,如果是则将其出栈,匹配成功;否则,说明右括号没有与之匹配的左括号,无效计数器加一。

最后,输出无效计数器即可得到结果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 数据结构求解