在刷题的过程中,发现在应用Python编程时,相关数据结构的基础知识有些遗忘,正好在B站看到了北大陈斌老师的数据结构网课,趁着在家巩固一下基础知识。
用Python实现栈
- 用Python的面向对象机制,可以用来实现用户自定义类型。
- 将ADT Stack实现为Python的一个Class
- 将ADT Class的操作实现为Class的方法
- 由于Stack是一个数据集,所以可以采用Python的原生数据集来实现,选用最常用的数据集List来实现。
- 细节:Stack的两端对应List设置
- 可以将List的任意一端
index=0或者-1
设置为栈顶 - 选用List的末端
index=-1
作为栈顶,这样栈的操作就可以通过对List的append和pop来实现
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def peek(self):
return self.items[len(self.items) - 1]
def size(self):
return len(self.items)
s = Stack()
print(s.isEmpty())
s.push(4)
s.push('dog')
print(s.peek())
s.push(True)
print(s.size())
print(s.isEmpty())
s.push(8.4)
print(s.pop())
print(s.pop())
print(s.size())
True
dog
3
False
8.4
True
2
- 如果我们把List的另一端(首端
index=0
)作为Stack的栈顶,同样也可以实现Stack。 - 性能有所不同,栈顶首端的版本其push/pop的复杂度为O(n),而栈顶尾端时其复杂度为O(1)。
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push(self, item):
self.items.insert(0,item)
def pop(self):
return self.items.pop(0)
def peek(self):
return self.items[0]
def size(self):
return len(self.items)
简单括号匹配
- 括号的使用必须遵循“平衡”规则
- 每一个开括号恰好对应一个闭括号
- 每对开闭括号必须正确的嵌套
简单小括号匹配
- 括号匹配识别算法
- 从左到右扫描括号串,最新打开的左括号,应该匹配最先遇到的右括号
- 第一个左括号(最早打开),匹配最后一个右括号(最后遇到)。
class Stack:
def __init__(self):
self.items = []
def isEmpty(self):
return self.items == []
def push