DAY 005--符号成对判断(栈的思想)
005 题目如下:
给定一个字符串,里边可能包含“()”、"{}"、“[]”三种括号,请编写程序检查该字符串的括号是否成对出现。
输出:
true:代表括号成对出现并且嵌套正确,或字符串无括号字符。
false:未正确使用括号字符。
流程分析:
如果了解数据结构,那么应该知道,简单的采用一个栈的特性,就能解决该问题,左括号栈顶字符必须和第一个入栈的右括号字符匹配。
- 栈介绍:栈是一种特殊的线性表,仅能在线性表的一端操作,栈顶允许操作,栈底不允许操作。
- 栈的特性:后进先出(LIFO)
下面用一幅流程图来说明程序运行步骤:
1、先定义一个栈,把符号写成一个字典的形式,分别定义左符号、右符号
2、判断字符串中是否有左符号,如果有,加入栈列表
3、判断字符串中是否有右符号,如果有:
3.1、如果栈不为空,并且右符号是栈列表中最后一个值得右符号,删除栈列最后一个值,用pop方法
3.2、不满足情况,则返回False
4、返回 not 栈--也就是栈为空的话,返回为True,如果栈列表为空,返回False (将剩余的有值的栈列错误排除掉)
代码分析:
BRANKETS={">":"<",")":"(","}":"{"} BRANKETS_LEFT=BRANKETS.values() BRANKETS_RIGHT=BRANKETS.keys() def branket_check(str): stack=[] for char in str: if char in BRANKETS_LEFT: stack.append(char) if char in BRANKETS_RIGHT: if stack and stack[-1]==BRANKETS[char]: stack.pop() else: return False return not stack def main(): s=input("输入您要查询的字符串:") if branket_check(s): print("\033[32m符号是成对出现的\033[0m") else: print("\033[31m符号不是成对出现的!\033[0m") if __name__ == '__main__': main()
题目反思:
1、BUG总结:
list=[1,2,3] print(list.pop([-1])) TypeError: 'list' object cannot be interpreted as an integer
BUG原因:
BUG1:删除列表最后一个值,我写了stack.pop([-1]),程序一直报错
BUG2:并没有考虑到会有stack还有一些没有删除的左符号的情况,所以得到结果和实际结果不一致
BUG解决:
BUG1:stack.pop() 直接就是删除列表中最后一个值,或者写成:stack.pop(-1),这样表达式:stack.pop([-1]) 是错误的
BUG2:最后的程序返回值不应该是return True/False,而应该是 return not stack
新学知识点:
1、第一次了解到栈列的思想,栈:后进先出,并且只允许栈顶操作,不允许栈底操作
2、学会如何判断看符号是不是成对出现,对以后成双成对出现的某些字符串的判断操作会有一些思路
Mark on 2018.04.07