棧(stack),有些地方稱爲堆棧,是一種(線性表)容器,可存入數據元素、訪問元素、刪除元素,它的特色在於只能容許在容器的一端(稱爲棧頂端指標,英語:top)進行加入數據(push)和輸出數據(pop)的運算。數據結構
棧沒有了位置概念,保證任什麼時候候能夠訪問、刪除的元素都是此前最後存入的那個元素,肯定了一種默認的訪問順序。app
因爲棧數據結構只容許在一端進行操做,於是按照後進先出(LIFO, Last In First Out)的原理運做。spa
棧能夠用順序表實現,也能夠用鏈表實現。code
1 class Stack: 2 "棧" 3 4 def __init__(self): 5 self.__list = [] 6 7 def push(self, item): 8 "添加一個新的元素item到棧頂" 9 self.__list.append(item) # 時間複雜度爲O(1) 10 # self.__list.insert(0, item) # 時間複雜度爲O(n) 11 12 def pop(self): 13 "彈出棧頂元素" 14 return self.__list.pop() # 接收列表pop方法的返回值 15 # self.__list.pop(0) # 時間複雜度爲O(n) 16 17 def peek(self): 18 "返回棧頂元素" 19 if self.__list: 20 return self.__list[-1] 21 else: 22 return 23 24 def is_empty(self): 25 "判斷棧是否爲空" 26 return self.__list == [] 27 # return not self.__head 28 29 def size(self): 30 "返回棧的元素個數" 31 return len(self.__list) 32 33 34 if __name__ == "__main__": 35 s = Stack() 36 print(s.is_empty()) # True 37 s.push(1) 38 print(s.is_empty()) # False 39 s.push(2) 40 s.push(3) 41 print(s.peek()) # 3 42 s.push(4) 43 s.push("hello") 44 print(s.pop()) # hello 45 print(s.pop()) # 4 46 print(s.size()) # 3
隊列(queue)是隻容許在一端進行插入操做,而在另外一端進行刪除操做的線性表。blog
隊列是一種先進先出的(FIFO, First In First Out)的線性表。容許插入的一端爲隊尾,容許刪除的一端爲隊頭,隊列不容許在中間部位進行操做。隊列
假設隊列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣咱們就能夠刪除時,老是從a1開始,而插入時,老是在隊列最後。這也比較符合咱們一般生活中的習慣,排在第一個的優先出列,最後來的固然排在隊伍最後。rem
同棧同樣,隊列也能夠用順序表或者鏈表實現。it
1 class Queue: 2 "隊列" 3 4 def __init__(self): 5 self.__list = [] 6 7 def enqueue(self, item): 8 "往隊列中添加一個item元素" 9 # 根據具體的使用頻率,決定添加/刪除元素的方式 10 self.__list.append(item) # O(1) 11 # self.__list.insert(0, item) # O(n) 12 13 def dequeue(self): 14 "從隊列頭部刪除一個元素" 15 return self.__list.pop(0) # O(n) 16 # return self.__list.pop() # O(1) 17 18 def is_empty(self): 19 "判斷一個隊列是否爲空" 20 return self.__list == [] 21 # return not self.__list 22 23 def size(self): 24 "返回隊列的大小" 25 return len(self.__list) 26 27 28 if __name__ == "__main__": 29 q = Queue() 30 print(q.is_empty()) # True 31 q.enqueue("hello") 32 print(q.is_empty()) # False 33 q.enqueue(1) 34 q.enqueue(2) 35 q.enqueue(3) 36 print(q.dequeue()) # hello 37 print(q.dequeue()) # 1 38 print(q.size()) # 2
雙端隊列(deque,全名double-ended queue),是一種具備隊列和棧的性質的數據結構。ast
雙端隊列中的元素能夠從兩端彈出,其限定插入和刪除操做在表的兩端進行。雙端隊列能夠在隊列任意一端入隊和出隊。class
1 class Deque: 2 "雙端隊列" 3 4 def __init__(self): 5 self.__list = [] 6 7 def add_front(self, item): 8 "往隊列頭部添加一個item元素" 9 self.__list.insert(0, item) 10 11 def add_rear(self, item): 12 "往隊列尾部添加一個item元素" 13 self.__list.append(item) 14 15 def remove_front(self): 16 "從隊列頭部刪除一個元素" 17 return self.__list.pop(0) 18 19 def remove_rear(self): 20 "從隊列尾部刪除一個元素" 21 return self.__list.pop() 22 23 def is_empty(self): 24 "判斷一個隊列是否爲空" 25 return self.__list == [] 26 # return not self.__list 27 28 def size(self): 29 "返回隊列的大小" 30 return len(self.__list) 31 32 33 if __name__ == "__main__": 34 d = Deque() 35 print(d.is_empty()) # True 36 d.add_front(1) 37 d.add_front(2) 38 d.add_rear(3) 39 d.add_rear(4) 40 print(d.is_empty()) # False 41 print(d.size()) # 4 42 print(d.remove_front()) # 2 43 print(d.remove_rear()) # 4 44 print(d.size()) # 2