爱吃菠萝包 发表于 2025-3-19 22:15:16

第二十讲课后习题最后一题,真的没看懂T_T

s = input("请输入测试字符串:")

stack = []



for c in s:

if c == '(' or c == '[' or c == '{':

stack.append(c)
else:


if len(stack) == 0:

    print("非法T_T")

    break



if c == ')':

    d = '('

elif c == ']':

    d = '['

elif c == '}':

    d = '{'



#从这里开始,后面就基本都蒙了,看讲解也没看懂,天啊,我是不是很笨T_T# 为啥子左边括号就比右边括号多了,又右边括号比左边括号多了
      if d != stack.pop():

    print("非法T_T")

    break

else:
if len(stack) == 0:

print("合法^o^")

else:

print("非法T_T")

FishC 发表于 2025-3-19 22:17:36

看起来你的代码是想要实现一个括号匹配的校验器,但目前代码有一些错误和不完整的部分。我来帮你梳理一下思路,并提供一个正确的实现方式。

括号匹配的基本原理
括号匹配的核心思想是使用 栈(stack) 这种数据结构。
- 遇到左括号 `(` `{` `[` 时,入栈。
- 遇到右括号 `)` `}` `]` 时,检查栈顶是否是对应的左括号,如果匹配则弹出栈顶,否则就是非法的。
- 最后如果栈为空,则说明括号匹配正确,否则就是非法的。

修正后的代码

s = input("请输入测试字符串:")
stack = []
bracket_map = {')': '(', '}': '{', ']': '['}

for c in s:
    if c in "({[":
      stack.append(c)# 左括号入栈
    elif c in ")}]":
      if not stack or stack.pop() != bracket_map:
            print("非法T_T")
            break
else:
    if len(stack) == 0:
      print("合法^o^")
    else:
      print("非法T_T")


代码解析

[*] `stack` 用来存储左括号。
[*] `bracket_map` 是一个字典,存储右括号对应的左括号。
[*] 遍历字符串 `s`,如果是左括号就入栈。
[*] 如果是右括号,就检查栈顶是否匹配,不匹配或栈为空则非法。
[*] 最后检查栈是否为空,空则合法,否则非法。


这样,你的括号匹配问题就可以正确解决啦!希望能帮到你,不要灰心哦,加油!^_^

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼的二师兄 发表于 2025-3-19 23:41:28

是这样的,stack 就是一个容器,你可以把它想象成一个篮子……

假设输入是 s = "({[]})",代码的执行过程如下:

1. ( 放进篮子 → 篮子 = ["("]

2. { 放进篮子 → 篮子 = ["(", "{"]

3. [ 放进篮子 → 篮子 = ["(", "{", "["]

4. ] 发现是右括号,检查篮子里 最后一个 是不是 [,匹配成功,取出 [ → 篮子 = ["(", "{"]

5. } 发现是右括号,检查篮子里 最后一个 是不是 {,匹配成功,取出 { → 篮子 = ["("]

6. ) 发现是右括号,检查篮子里 最后一个 是不是 (,匹配成功,取出 ( → 篮子 = []

7. 篮子空了,说明括号完全匹配

仔细观察以上步骤,对应到代码中的实现,是否更清晰了呢?

小甲鱼的二师兄 发表于 2025-3-20 02:32:00

作了个图,帮助你理解:

happyweeks365 发表于 2025-3-20 09:43:56

6666666666666666666666666666666

爱吃菠萝包 发表于 2025-3-20 20:43:15

小甲鱼的二师兄 发表于 2025-3-20 02:32
作了个图,帮助你理解:

感谢大佬
页: [1]
查看完整版本: 第二十讲课后习题最后一题,真的没看懂T_T