代码不懂
这是小甲鱼作业中的一题if len(stack) == 0: 这个不懂
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
# 逐个给出 c 对应的右括号 d
if c == ')':
d = '('
elif c == ']':
d = '['
elif c == '}':
d = '{'
# 对比 d 和从特殊列表尾部弹出的元素
if d != stack.pop():
print("非法T_T")
break
else:
# 如果循环走完,特殊列表不为空,那么肯定是左括号比右括号多的情况
# 那肯定有同学会问:右括号比左括号多的情况在哪里判断?
# 小甲鱼答:在上面 d != stack.pop() 的判断中已经可以排除了~
if len(stack) == 0:
print("合法^o^")
else:
print("非法T_T") 本帖最后由 sfqxx 于 2023-5-24 20:21 编辑
这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后遍历字符串中的每一个字符:
如果当前字符是左括号,则将其添加到特殊列表中。
如果当前字符是右括号,则从特殊列表的尾部取出一个元素并与之匹配:
如果特殊列表为空(即没有左括号),则说明字符串非法,直接跳出循环;
如果取出的元素与当前右括号对应的左括号不同,那么也说明字符串非法,跳出循环;
如果取出的元素与当前右括号对应的左括号相同,则继续遍历字符串。
如果遍历完整个字符串,特殊列表不为空,那么说明字符串中左括号比右括号多,输出 "非法T_T";
否则,输出 "合法^o^"。
而在这段代码中,
if len(stack) == 0:
print("非法T_T")
break
是判断特殊列表(即栈)是否为空的语句。如果特殊列表为空,那么当前字符是右括号,但是却没有对应的左括号,因此字符串非法,需要直接跳出循环。如果不加 break 语句,程序还会继续运行,直到遍历完整个字符串才会输出 "非法T_T"。
有用请设置最佳答案 sfqxx 发表于 2023-5-24 20:17
这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后 ...
谢谢啊
岁月如此这般 发表于 2023-5-24 20:22
谢谢啊
给我最佳答案呗{:5_92:} sfqxx 发表于 2023-5-24 20:17
这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后 ...
可以给个示范吗?
岁月如此这般 发表于 2023-5-24 20:24
可以给个示范吗?
什么意思?{:9_241:} sfqxx 发表于 2023-5-24 20:25
什么意思?
给个例子看看怎么才能输出合法
[*]""(空字符串),输出 "合法^o^";
[*]"{}()", 输出 "合法^o^";
[*]"[()]", 输出 "合法^o^";
领个币 合法括号序列的判断,主要运用了数据结构栈。 对于栈而言,我们只能操作一个线性表顶端的元素,只能删除和添加。 if len(stack) == 0: 这个不懂
这个就是看,如果 stack 的长度非 0 ,也就是说,栈中还有一些元素,那么,这些元素肯定是匹配不上任何一个括号的,因此,这个括号序列就不合法。
如果是 0,就说明所有的括号都匹配成功,是一个合法的括号序列,例如:
{}}}
执行完后,栈中只剩下两个没有匹配上的 },所以这个括号序列不合法。
说白了,就想领个币{:10_250:} {:10_277:} myd0313 发表于 2023-5-24 20:58
{:10_277:} {:7_146:} {:10_335:}逛一圈 错过了{:10_257:} {:10_279:}{:10_279:}{:10_279:} 好多蹭币的啊,O(∩_∩)O哈哈~
领个币?