以前学习的时候都没怎么好好的做过笔记,总是东记一点,西写一点,甚至都不做笔记,导致后面找的时候找不到,最后还是求助搜索引擎浪费掉很多时间。好脑筋不如个烂笔头呀。
这次又重新学习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)的左括号,应该匹配最先遇到的右括号。这样,第一个左括号(最早打开),就应该匹配最后一个右括号(最后遇到)。这种次序反转的识别,正好符合栈的特性。
## 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