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

posted @ 2018-04-07 23:39  JunSheep  阅读(821)  评论(0编辑  收藏  举报