leetcode 题解 20. 有效括号(采用栈 python实现栈操作)

20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,
判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

题解:

直接用栈实现,将左括号入栈,当扫到右括号时出栈,当栈空则返回

在python中其实栈就是表 [] 但是写个栈类,看着更加优雅 优雅永不过时 !!! 针对小问题而言,其实没必要写个栈类,直接列表就可,但是在较大程序中,写个栈类,会更便捷,可读性,维护上也更容易。

最重要 python需要优雅,优雅永不过时!!!

栈类

class Stack(object):
    def __init__(self):
        """
        创建一个Stack类
        对栈进行初始化参数设计
        """
        self.stack = [] #存放元素的栈
    def get_top(self):
        """
        获取栈顶元素
        """
        if self.stack:
            return self.stack[-1]
        else:
            return None
    def push(self, data):
        """
        压入 push :将新元素放在栈顶
        当新元素入栈时,栈顶上移,新元素放在栈顶。
        """
        self.stack.append(data)
    def pop(self):
        """
        弹出 pop :从栈顶移出一个数据
        - 栈顶元素拷贝出来
        - 栈顶下移
        - 拷贝出来的栈顶作为函数返回值
        """
        # 判断是否为空栈
        if self.stack:
            return self.stack.pop()
        else:
            raise IndexError("从空栈执行弹栈操作")
    def is_empty(self):
        """
        判断栈是否为空
        """
        # 栈为非空时,self.stack为True,再取反,为False
        return not bool(self.stack)
    def size(self):
        """
        返回栈的大小
        """
        return len(self.stack)
class Solution(object):
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        r=Stack()
        for x in s:
            if x=="(" or x=="{" or x=="[":
                r.push(x)
            elif x==")" and r.get_top()=="(":
                r.pop()
            elif x=="}" and r.get_top()=="{":
                r.pop()
            elif x=="]" and r.get_top()=="[":
                r.pop()
            else:
                return False
        if r.is_empty():
            return True
        else:
            return False
  • 时间复杂度:

只是遍历一遍字符串 O(n)

  • 空间复杂度:

由于使用了一个栈(本质是个表[]),故空间上就是一个表

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

01_

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值