栈——有效括号问题

Posted wl413911

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈——有效括号问题相关的知识,希望对你有一定的参考价值。

问题:给定一个只包括 ‘(‘,‘)‘,‘{‘,‘}‘,‘[‘,‘]‘ 的字符串,判断字符串是否有效。

有效字符串需满足:

    1、左括号必须用相同类型的右括号闭合。
    2、左括号必须以正确的顺序闭合。
 3、空字符串可被认为是有效字符串。

解法一: 笨办法,分情况判断,代码比较冗长

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        if s == "": # 单独处理s为空的情况
            return True
 
        stack = [] # 建立一个空的栈
 
        for item in s: # 遍历
            if len(stack) == 0: # 如果堆栈为空,直接入栈,跳过此次循环
               stack.append(item)
               continue
 
       # 下面分别判断了三种右括号的情况
 
            if item == ‘)‘:
                length = len(stack)
                if stack[length-1] == ‘(‘:
                    del stack[length-1]
                    continue
            if item == ‘]‘:
                length = len(stack)
                if stack[length-1] == ‘[‘:
                    del stack[length-1]
                    continue
            if item == ‘}‘:
                length = len(stack)
                if stack[length-1] == ‘{‘:
                    del stack[length-1]
                    continue
 
       # 如果item不是右括号,或者栈顶元素不是左括号,则压栈,继续循环
 
            stack.append(item)
        
     # 最后判断,stack是否为空
 
        if len(stack) != 0:
            return False
        return True


方案二:比较简洁的写法, 用map存储所有的 括号

class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        stack = []
        bracket_map = {‘}‘:‘{‘,‘)‘:‘(‘,‘]‘:‘[‘}

        for ch in s:
            if ch not in bracket_map: # 如果ch不是右括号,则压栈
                stack.append(ch)
            elif not stack or bracket_map[ch]!=stack.pop(): # 如果ch是‘右括号’,那么栈顶元素一定可以找到与之对应的‘左括号’;如果没有,那么不合法
                return False
        return not stack # 最后,判断stack是否为空,这种写法比较简洁,只是代码不太直观


 

以上是关于栈——有效括号问题的主要内容,如果未能解决你的问题,请参考以下文章

c# 使用栈实现有效的括号

leetcode-简单-栈-有效的括号

32. 最长有效括号. ①栈

最长有效括号

栈3:括号匹配问题的7道题

LeetCode经典栈-有效的括号(难度:⭐)