栈-括号匹配问题
括号匹配问题
算法分析
- 初始化一个空栈,顺序读入括号
- 若是右括号则与栈顶元素进行匹配(#若匹配,则弹出栈顶元素并进行下一元素 #若不匹配,则该序列不合法)栈顶一定是最里层的那个
- 若是左括号,则压入栈中
- 若全部元素遍历完毕,栈中仍然存在元素,则该序列不合法
# 栈 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('[{(())}]'))

浙公网安备 33010602011771号