Python面试题:使用栈处理括号匹配问题

括号匹配是栈应用的一个经典问题,

题目

判断一个文本中的括号是否闭合,
如: text = "({[({ {abc}})][{1}]})2([]){({[]})}[]", 判断所有括号是否闭合

思路

  • 使用栈后进先出的原则, 当字符是([{之一时, 入栈
  • 当字符是)]}之一时, 判断栈顶与当前字符是否是一对,
  • 如果匹配, 弹出该括号(该括号匹已封闭), 继续判断下一个字符
  • 如果不匹配, 直接return False

相关代码

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''

text = "({[({
     {abc}})][{1}]})2([]){({[]})}[]"

def is_closed(text:str) -> bool:  
    """
    判断文本中括号是否封闭
    :param:text 包含括号的文本字符串
    :returns: True无括号或所有括号全部封闭
                   False 存在括号不封闭
    """
    stack = []  # 使用list模拟栈, stack.append()入栈, stack.pop()出栈并获取栈顶元素
    brackets = {
     ')':'(',']':'[','}':'{'}  # 使用字典存储括号的对应关系, 使用反括号作key方便查询对应的括号
    for char in text:
        if char in brackets.values():   # 如果是正括号,入栈
            stack.append(char)
        elif char in brackets.keys():  # 如果是反括号
            if brackets[char] != stack.pop():  # 如果不匹配弹出的栈顶元素
                return False
    return True

print(is_closed(text))

注:

  • 手写代码时建议尽量遵循PEP8规范, 写出清晰高效的代码
  • 返回bool类型的用is_开头
  • 建议写上标准的docstring注释(其他 # 注释不用写)
  • 注意优化算法

你可能感兴趣的:(python)