• 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("33[32m符号是成对出现的33[0m")
        else:
            print("33[31m符号不是成对出现的!33[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

  • 相关阅读:
    Android简易注解View(java反射实现)
    android注解[Jake Wharton Butter Knife]
    Android渠道汇总
    SVN管理规范
    马上着手开发iOS应用程序一 todolist
    MVC记录
    OC中intValue要注意的地方
    将从数组中取到的字符串赋值给了UIImage导致的错误
    一个null引发的错误
    记录一些容易忘记的属性 -- UITabBarController
  • 原文地址:https://www.cnblogs.com/JunSheep/p/8735625.html
Copyright © 2020-2023  润新知