栈-括号匹配问题

括号匹配问题

算法分析

  • 初始化一个空栈,顺序读入括号
  • 若是右括号则与栈顶元素进行匹配(#若匹配,则弹出栈顶元素并进行下一元素 #若不匹配,则该序列不合法)栈顶一定是最里层的那个
  • 若是左括号,则压入栈中
  • 若全部元素遍历完毕,栈中仍然存在元素,则该序列不合法
#
class ArrayStack:
    """ 基于数组实现的栈 """
    def __init__(self):
        """ 构造方法 """
        self.__stack = []  # 列表(私有)

    def push(self, item):
        """ 入栈 """
        self.__stack.append(item)

    def is_empty(self):
        """ 判断栈是否为空 """
        return self.__stack == []  # return True或False

    def pop(self):
        """ 出栈 """
        assert not self.is_empty(), "栈为空"
        return self.__stack.pop()

    def peek(self):
        """ 访问栈顶元素 """
        assert not self.is_empty(), "栈为空"
        return self.__stack[-1]
# 括号匹配问题
def brace_match(s):  # s 为输入的一串括号
    match = {')':'(',']':'[','}':'{'}  # 自定义一个字典,键位右括号,值为左括号
    stack = ArrayStack()  # 建立栈
    for ch in s:
        if ch in {'(','[','{'}:
            stack.push(ch)  # 左括号入栈
        else: # ch in {')',']','}'}
            if stack.is_empty():
                return False
            elif stack.peek() == match[ch]: # 如果左括号 与 字典右括号的值左括号 相等则出栈
                stack.pop()
            else:   # stack.peek() != match[ch]
                return False
    if stack.is_empty():  # 为空时,即匹配完成,返回True
        return True
    else:
        return False


print(brace_match('[{(())}]'))

 

posted @ 2023-06-12 20:09  天才九少  阅读(32)  评论(0)    收藏  举报