鱼C论坛

 找回密码
 立即注册
查看: 1036|回复: 6

求解惑

[复制链接]
发表于 2022-2-24 23:06:57 | 显示全部楼层 |阅读模式

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

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

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 = '{'
   
        if d != stack.pop():
            print("非法T_T")
            break
else:
    if len(stack) == 0:
        print("合法^o^")
    else:
        print("非法T_T")

问一下大家这个代码判断'()'时它前面把'('弄到列表里然后怎么判断')'啊?为什么最后说len(stack) == 0时是合法?前边列表里不是有一个'('吗?而且还有一个')'没判断...代码是正确的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-2-25 00:03:50 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-25 09:59 编辑

你的代码有点问题
        if c == ')':
            d = '('
        elif c == ']':
            d = '['
        elif c == '}':
            d = '{'
   
        if d != stack.pop():
            print("非法T_T")
            break

这一部分,在不满足上面的条件语句的情况下,d 不会被赋值,可你在后面对 d 进行了判断,
d 没有定义的情况下就会报错

你如果是想判断以括号为边界,括号里面不为空的字符串没必要那么麻烦
  1. s = input("请输入测试字符串:")
  2. if s[0] + s[-1] in {'()', '[]', '{}'} and s[1:-1]:
  3.     print("合法^o^")
  4. else:
  5.     print("非法T_T")
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-25 11:22:39 | 显示全部楼层
我觉得可以直接在:
  1. s = input("请输入测试字符串:")

  2. stack = []
  3.    
  4. for c in s:
  5.     if c == '(' or c == '[' or c == '{':
  6.         stack.append(c)
  7.     else:
  8.         if len(stack) == 0:
  9.             print("非法T_T")
  10.             break
  11.    
  12.         if c == ')':
  13.             d = '('
  14.         elif c == ']':
  15.             d = '['
  16.         elif c == '}':
  17.             d = '{'
  18.    
  19.         if d != stack.pop():
  20.             print("非法T_T")
  21.             break
  22. else:
  23.     if len(stack) == 0:
  24.         print("合法^o^")
  25.     else:
  26.         print("非法T_T")
复制代码

中的第 8 行:
  1. else:
复制代码

下面加一条:
  1. d = None
复制代码

就好了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-2-25 21:20:54 | 显示全部楼层
isdkz 发表于 2022-2-25 00:03
你的代码有点问题

这一部分,在不满足上面的条件语句的情况下,d 不会被赋值,可你在后面对 d 进行了判 ...

如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-25 21:25:30 | 显示全部楼层
I-am刘sir 发表于 2022-2-25 21:20
如果不满足条件的话d会被定义为!=stack.pop(),所以最后会打印"非法",您可以自己打代码试一下


我已经试过了,首先你的 d 除了那个条件语句没有其它赋值的地方,

那如果你的条件语句里面的所有条件都不满足,d 就没有被赋值,那下面用 d 来做判断肯定是会报 NameError 的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-25 22:39:18 | 显示全部楼层
  1. brackets = {'(': ')', '[': ']', '{': '}'}
  2. string = input("请输入测试字符串:")
  3. arr = []

  4. for n, s in enumerate(string):
  5.     if not n and s in brackets.values():
  6.         print("非法")
  7.         break
  8.     elif s in brackets.keys(): arr.append(s)
  9.     elif s in brackets.values():
  10.         if brackets[arr[-1]] != s:
  11.             print("非法")
  12.             break
  13.         else: arr.pop()
  14. else:
  15.     print("合法")
复制代码
  1. 请输入测试字符串:(()())
  2. 合法

  3. 请输入测试字符串:((])([))
  4. 非法

  5. 请输入测试字符串:([)]
  6. 非法

  7. 请输入测试字符串:({}[]())[]
  8. 合法
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-2-26 09:37:25 | 显示全部楼层
你那个代码如果括号里面没有内容的话是可以的。

第一个问题:

把括号 append 到列表里是一个入栈的过程,pop 是一个出栈的过程

栈是后进先出的

一旦碰到右括号,就把列表里面的元素出栈,

因为栈里面的元素都是左括号,遇到右括号的时候最先出栈的肯定是离它最近的左括号,

if d != stack.pop() 如果离它最近的左括号不是它相对应的左括号,输出非法

第二个问题:

if len(stack) == 0 也就是说当遍历完了所有的括号,

还有左括号没出栈的话,也就是说这个左括号没有相对应的右括号,所以就非法

第三个问题:

如果所有的右括号都有对应的左括号的话,列表肯定是空的,

因为遇到右括号的时候就把最后加进列表的左括号(也就是离这个右括号最近的左括号)给弹出列表了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 06:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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