https://www.bilibili.com/video/av53583801/?p=32
学习笔记
1 Stack
栈只是一个容器,数据存储形式不局限于某一种,比如顺序表、链表都可以,只要满足 FILO(First in Last out)。为了方便,我们这里采用顺序表的形式实现栈,因为 python 的 list 就可以当顺序表用!
class Stack(object):
"栈"
def __init__(self):
self.__list = [] # 用列表,也即顺序表的数据存储方式
def is_empty(self):
"判断栈是否为空,空返回True"
return self.__list == []
def size(self):
"求栈元素的个数"
return len(self.__list)
def push(self,item):
"进栈"
self.__list.append(item) #这里选择在尾巴上加,复杂度 o(1),如果用insert在头上加复杂度为o(n)
def peek(self):
"返回栈顶元素"
if self.is_empty():
return None
else:
return self.__list[-1]
def pop(self):
"出栈"
if self.is_empty():
return None
else:
return self.__list.pop()
if __name__ == "__main__":
s = Stack()
print("empty:",s.is_empty())
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print("empty:",s.is_empty())
print("size:",s.size())
print("peek:",s.peek())
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
output
empty: True
empty: False
size: 4
peek: 4
4
3
2
1
2 Queue
用 list 实现的话,如果头入O(n)尾出O(1)
,和尾入O(1)头出O(n)
,复杂度都是 O(n)!这个时候要根据实际操作来选择合适的写法,比如你是经常入队列的话,建议用尾入O(1)头出O(n)
,如果你是经常出队列的话,就头入O(n)尾出O(1)
class Queue(object):
"队列"
def __init__(self):
self.__list = [] # 用列表,也即顺序表的数据存储方式
def is_empty(self):
"是否为空"
return self.__list==[]
def enqueue(self,item):
"入队列"
self.__list.append(item)
def dequeue(self):
"出队列"
if self.is_empty():
return None
else:
return self.__list.pop(0)
def size(self):
"求队列的长度"
return len(self.__list)
def peek(self):
"查看队首元素"
if self.is_empty():
return None
else:
return self.__list[0]
if __name__ == "__main__":
q = Queue()
print("empty:",q.is_empty())
q.enqueue(1)
q.enqueue(2)
q.enqueue(3)
q.enqueue(4)
print("empty:",q.is_empty())
print("size:",q.size())
print("peek:",q.peek())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
print(q.dequeue())
output
empty: True
empty: False
size: 4
peek: 1
1
2
3
4
3 Double-End Queue
和队列的区别就是,头部可入可出,尾部可入可出!我们实现的时候头部指的是 list 下标为 0 的地方!当然你也可以让 list 的最后一个元素是头部!
class DeQueue(object):
"双端队列"
def __init__(self):
self.__list = [] # 用列表,也即顺序表的数据存储方式
def is_empty(self):
"是否为空"
return self.__list==[]
def add_front(self,item):
"头入队列"
self.__list.insert(0,item)
def add_rear(self,item):
"尾入队列"
self.__list.append(item)
def pop_front(self):
"头出队列"
if self.is_empty():
return None
else:
return self.__list.pop(0)
def pop_rear(self):
"尾出队列"
if self.is_empty():
return None
else:
return self.__list.pop()
def size(self):
"求队列的长度"
return len(self.__list)
def peek(self):
"查看队首元素"
if self.is_empty():
return None
else:
return self.__list[0]