飞花落尽 发表于 2021-7-7 19:39:31

作业20,设计判断字符是否合理的程序,运行结果都是不合理?(萌新,求带)

s = input("请输入测试字符串:")
b = []
for i in s:
    if i in ['(',')','[',']','{','}']:
      if i == "(" or "[" or "{":
            b.append(i)
      elif i ==")" and b[-1]=="(":
            b.pop()
      elif i =="]" and b[-1]=="[":
            b.pop()
      elif i =="}" and b[-1]=="{":
            b.pop()
    if b ==[]:
      print("合法!")
    else:
      print("不合法!")
要求
1.字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
2.左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
3.左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的

sunrise085 发表于 2021-7-7 19:39:32

两个问题。
第二个if的两个or写法不对
末尾的if…else…层次不对
s = input("请输入测试字符串:")
b = []
for i in s:
    if i in ['(',')','[',']','{','}']:
      if i == "(" or i =="[" or i =="{":#这里写的不对
            b.append(i)
      elif i ==")" and b[-1]=="(":
            b.pop()
      elif i =="]" and b[-1]=="[":
            b.pop()
      elif i =="}" and b[-1]=="{":
            b.pop()
if b ==[]:#这里层次不对,不应该在for里面
    print("合法!")
else:
    print("不合法!")

阿奇_o 发表于 2021-7-7 20:39:54

你这思路我没看出来,还有明显的错误 ——
假设字符是 都是 右括号,如 "))))"(不合法),你的循环里 if 和 elif 都不成立,这时 b == [] --> 合法?

---
我说一下我的思路:以成对的左右括号为了例, 从左往右遍历字符,若首先就遇到右括号,就中止循环,不合法;
当一遇到 “左括号”,就 加1, 遇到“右括号” 就减1,最终结果为0 ,即为 左右匹配,合法。

飞花落尽 发表于 2021-7-8 11:58:21

sunrise085 发表于 2021-7-7 19:39
两个问题。
第二个if的两个or写法不对
末尾的if…else…层次不对

厉害!

飞花落尽 发表于 2021-7-8 11:58:51

阿奇_o 发表于 2021-7-7 20:39
你这思路我没看出来,还有明显的错误 ——
假设字符是 都是 右括号,如 "))))"(不合法),你的循环里 if...

谢谢你

飞花落尽 发表于 2021-7-8 12:01:24

sunrise085 发表于 2021-7-7 19:39
两个问题。
第二个if的两个or写法不对
末尾的if…else…层次不对

可以问问我写的 or 与你的有什么区别吗?

飞花落尽 发表于 2021-7-8 12:45:19

阿奇_o 发表于 2021-7-7 20:39
你这思路我没看出来,还有明显的错误 ——
假设字符是 都是 右括号,如 "))))"(不合法),你的循环里 if...

对对对,我再改进一下

sunrise085 发表于 2021-7-8 12:55:08

飞花落尽 发表于 2021-7-8 12:01
可以问问我写的 or 与你的有什么区别吗?

or的用法,是多个逻辑表达式并列,一个为True,则结果为True。
i == "(" or "[" or "{"
这种写法,是把    i == "("     "["   "{"    三者并列,第一部分不一定为True,后两者一定为True,所以永远为True
还有另外一种写法,就像你的第一个if那样写
if i in '({[':
页: [1]
查看完整版本: 作业20,设计判断字符是否合理的程序,运行结果都是不合理?(萌新,求带)