数据结构括号匹配代码_数据结构与算法笔记—栈

以前学习的时候都没怎么好好的做过笔记,总是东记一点,西写一点,甚至都不做笔记,导致后面找的时候找不到,最后还是求助搜索引擎浪费掉很多时间。好脑筋不如个烂笔头呀。 这次又重新学习python的数据结构及算法(中国MOOC上的公开课),就好好做个笔记吧。 栈是一种只能在一端进行插入和删除的线性数据结构。 一般来说,栈主要有两个操作:一个是进栈(PUSH),又叫作入栈、压栈;另一个是出栈(POP),或者叫作退栈。栈遵循的原则是后进先出,即LIFO(Last In First Out)。 下面使用python的基本结构列表实现栈:
## 使用列表的末尾作为栈顶## 也可使用列表的开头作为栈顶,其实这两种方法的性能是不同的## 列表开头作为栈顶,复杂度为 O(n)## 列表末尾作为栈顶,复杂度为 O(1)class Stack:    def __init__(self):        self.items = []            def isEmpty(self):        return self.items == []            def push(self, item):        self.items.append(item)            def pop(self, item):        return self.items.pop()            def peek(self):        return self.items[len(self.items) - 1]            def size(self):        return len(self.items)
栈的应用:领扣上有个题是关于括号匹配的。基本思想就是:从左至右扫描括号串,最新打开(Most recent)的左括号,应该匹配最先遇到的右括号。这样,第一个左括号(最早打开),就应该匹配最后一个右括号(最后遇到)。这种次序反转的识别,正好符合栈的特性。

0705cb404eda0010c248a803ef0a8ad7.png

c4d474576a1c2b7472cc1a3781f80feb.png

代码的实现有一个简单版的(只检查小括号)和一个普通版的(同时检查小括号,中括号及大括号),现实中遇到更多的自然是普通版的。这里就只贴下普通版了。
## Stack()是上面写好的类def matches(open, close):    opens = '([{'    closes = ')]}'    return opens.index(open) == closes.index(close)def check(strings):    s = Stack()    balance = True    index = 0    while index and         symbol = strings[index]        if symbol in '([{':            s.push(symbol)        else:            if s.isEmpty():                balance = False            else:                top = s.pop()                if not matches(top, symbol):                    balance = False        index += 1    if balance and s.isEmpty():        return True    else:        return False        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值