鱼C论坛

 找回密码
 立即注册
查看: 171|回复: 5

[已解决]第二十讲课后习题最后一题,真的没看懂T_T

[复制链接]
发表于 2025-3-19 22:15:16 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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")
最佳答案
2025-3-19 23:41:28
是这样的,stack 就是一个容器,你可以把它想象成一个篮子……

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

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

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

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

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

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

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[c]:  
            print("非法T_T")  
            break  
else:  
    if len(stack) == 0:  
        print("合法^o^")  
    else:  
        print("非法T_T")  


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-19 23:41:28 | 显示全部楼层    本楼为最佳答案   
是这样的,stack 就是一个容器,你可以把它想象成一个篮子……

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

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

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

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

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

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

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

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

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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-20 02:32:00 | 显示全部楼层
作了个图,帮助你理解:

1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-20 09:43:56 | 显示全部楼层
6666666666666666666666666666666
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-3-20 20:43:15 From FishC Mobile | 显示全部楼层
小甲鱼的二师兄 发表于 2025-3-20 02:32
作了个图,帮助你理解:

感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 02:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表