第二十讲课后习题最后一题,真的没看懂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") 看起来你的代码是想要实现一个括号匹配的校验器,但目前代码有一些错误和不完整的部分。我来帮你梳理一下思路,并提供一个正确的实现方式。
括号匹配的基本原理
括号匹配的核心思想是使用 栈(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 小助理,如未能正确解答您的问题,请继续追问。 是这样的,stack 就是一个容器,你可以把它想象成一个篮子……
假设输入是 s = "({[]})",代码的执行过程如下:
1. ( 放进篮子 → 篮子 = ["("]
2. { 放进篮子 → 篮子 = ["(", "{"]
3. [ 放进篮子 → 篮子 = ["(", "{", "["]
4. ] 发现是右括号,检查篮子里 最后一个 是不是 [,匹配成功,取出 [ → 篮子 = ["(", "{"]
5. } 发现是右括号,检查篮子里 最后一个 是不是 {,匹配成功,取出 { → 篮子 = ["("]
6. ) 发现是右括号,检查篮子里 最后一个 是不是 (,匹配成功,取出 ( → 篮子 = []
7. 篮子空了,说明括号完全匹配
仔细观察以上步骤,对应到代码中的实现,是否更清晰了呢?
作了个图,帮助你理解:
6666666666666666666666666666666 小甲鱼的二师兄 发表于 2025-3-20 02:32
作了个图,帮助你理解:
感谢大佬
页:
[1]