|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
我在做小甲鱼老师的课后练习题,如题如下:
0. 请编写一个程序,判断给定的字符串 s 中括号的写法是否合法。
条件:
字符串仅包含 '('、')'、'['、']'、'{'、'}' 这三对括号的组合
• 左右括号必须成对编写,比如 "()" 是合法的,"(" 则是非法的
• 左右括号必须以正确的顺序闭合,比如 "{()}" 是合法的,"{(})" 则是非法的
具体情况请见附件图片示例.
代码答案如下:
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")
我参照答案试了一下,但发现如果把if d != stack.pop():语句中的if改为elif,则得出完全相反的答案.
当if d != stack.pop():时,如果我输入[],程序输出”合法T_T”,请见if截图.
当改为elif d != stack.pop():时,如果我输入[],程序则输出”非法T_T”,请见elif截图.
我的困惑是为什么d != stack.pop():语句前缀为if或elif时,得出的结论完全相反?请大佬帮忙指点迷津一下,谢谢!
本题合理使用字典可以大幅度简化代码:
- e , stack , f = {'}' : '{' , ']' : '[',')' : '('} , [] , False
- s = input("请输入测试字符串:")
- for c in s :
- if c in e . values() :
- stack . append(c)
- else :
- if not stack or e[c] != stack . pop() :
- break
- else :
- if not stack :
- f = True
- print("合法^o^") if f else print("非法T_T")
复制代码
运行实况:
- D:\[exercise]\Python>python x.py
- 请输入测试字符串:(((([[[[{{{{}}}}(())]]]]}}}}
- 非法T_T
- D:\[exercise]\Python>python x.py
- 请输入测试字符串:(((([[[[{{{{}}}}(())]]]]))))
- 合法^o^
- D:\[exercise]\Python>
复制代码
|
|