岁月如此这般 发表于 2023-5-24 20:13:09

代码不懂

这是小甲鱼作业中的一题
    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:17:15

本帖最后由 sfqxx 于 2023-5-24 20:21 编辑

这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后遍历字符串中的每一个字符:

如果当前字符是左括号,则将其添加到特殊列表中。
如果当前字符是右括号,则从特殊列表的尾部取出一个元素并与之匹配:
如果特殊列表为空(即没有左括号),则说明字符串非法,直接跳出循环;
如果取出的元素与当前右括号对应的左括号不同,那么也说明字符串非法,跳出循环;
如果取出的元素与当前右括号对应的左括号相同,则继续遍历字符串。
如果遍历完整个字符串,特殊列表不为空,那么说明字符串中左括号比右括号多,输出 "非法T_T";
否则,输出 "合法^o^"。
而在这段代码中,

if len(stack) == 0:
    print("非法T_T")
    break
是判断特殊列表(即栈)是否为空的语句。如果特殊列表为空,那么当前字符是右括号,但是却没有对应的左括号,因此字符串非法,需要直接跳出循环。如果不加 break 语句,程序还会继续运行,直到遍历完整个字符串才会输出 "非法T_T"。

有用请设置最佳答案

岁月如此这般 发表于 2023-5-24 20:22:34

sfqxx 发表于 2023-5-24 20:17
这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后 ...

谢谢啊

sfqxx 发表于 2023-5-24 20:22:57

岁月如此这般 发表于 2023-5-24 20:22
谢谢啊

给我最佳答案呗{:5_92:}

岁月如此这般 发表于 2023-5-24 20:24:23

sfqxx 发表于 2023-5-24 20:17
这段代码是用来检查一个字符串中的括号是否匹配的。在该代码中,将所有的左括号放入一个特殊的列表中,然后 ...

可以给个示范吗?

sfqxx 发表于 2023-5-24 20:25:13

岁月如此这般 发表于 2023-5-24 20:24
可以给个示范吗?

什么意思?{:9_241:}

岁月如此这般 发表于 2023-5-24 20:26:33

sfqxx 发表于 2023-5-24 20:25
什么意思?

给个例子看看怎么才能输出合法

sfqxx 发表于 2023-5-24 20:28:00


[*]""(空字符串),输出 "合法^o^";
[*]"{}()", 输出 "合法^o^";
[*]"[()]", 输出 "合法^o^";

sfqxx_小 发表于 2023-5-24 20:30:20

领个币

zhangjinxuan 发表于 2023-5-24 20:55:08

合法括号序列的判断,主要运用了数据结构栈。

myd0311 发表于 2023-5-24 20:55:41

对于栈而言,我们只能操作一个线性表顶端的元素,只能删除和添加。

myd0313 发表于 2023-5-24 20:58:01

if len(stack) == 0:    这个不懂
这个就是看,如果 stack 的长度非 0 ,也就是说,栈中还有一些元素,那么,这些元素肯定是匹配不上任何一个括号的,因此,这个括号序列就不合法。

如果是 0,就说明所有的括号都匹配成功,是一个合法的括号序列,例如:

{}}}

执行完后,栈中只剩下两个没有匹配上的 },所以这个括号序列不合法。

说白了,就想领个币{:10_250:}

myd0313 发表于 2023-5-24 20:58:31

{:10_277:}

myd0313 发表于 2023-5-24 20:59:03

myd0313 发表于 2023-5-24 20:58


{:10_277:}

一位朋友 发表于 2023-5-24 21:10:28

{:7_146:}

yinda_peng 发表于 2023-5-24 21:50:40

{:10_335:}逛一圈

isdkz 发表于 2023-5-24 22:21:22

错过了{:10_257:}

kerln888 发表于 2023-5-25 09:10:51

{:10_279:}{:10_279:}{:10_279:}

岁月如此这般 发表于 2023-5-31 18:58:44

好多蹭币的啊,O(∩_∩)O哈哈~

lhz369 发表于 2023-6-7 17:47:45

领个币?
页: [1] 2
查看完整版本: 代码不懂