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]