資料結構學習篇之棧和佇列
阿新 • • 發佈:2018-12-17
棧和佇列是什麼
棧和佇列是兩種特殊的線性表,它們是限定只能在表的一端或兩端進行插入、刪除元素的線性表,因此,統稱為限定性資料結構。
共同點:
都是隻能線上性表的端點插入和刪除。
不同點:
棧的插入和刪除都線上性表的同一個端點,該點通稱棧頂,相應地,不能插入刪除的另一個端點通稱棧底,其特性是後進先出。
佇列線上性表的表頭插入,表尾刪除,表頭一般稱隊頭,表尾一般稱隊尾,其特性是先進先出。
1.棧
棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,top)進行加入資料(push)和輸出資料(pop)的運算。
棧是一種只能通過訪問其一端來實現資料儲存與檢索的線性資料結構,具有後進先出(last in first out,LIFO)的特徵。
棧結構Python實現:
class Stack(object): """棧""" def __init__(self): self.items = [] def is_empty(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) if __name__ == "__main__": stack = Stack() stack.push("one") stack.push("two") stack.push("three") print(stack.size()) print(stack.peek()) print(stack.pop()) print(stack.pop()) print(stack.pop())
2.佇列
佇列(queue)是一種具有先進先出特徵的線性資料結構,元素的增加只能在一端進行,元素的刪除只能在另一端進行。能夠增加元素的佇列一端稱為隊尾,可以刪除元素的佇列一端則稱為隊首。
佇列Python實現:
class Queue(object): """佇列""" def __init__(self): self.items = [] def is_empty(self): """判斷是否為空""" return self.items == [] def enqueue(self, item): """進佇列""" self.items.insert(0,item) def dequeue(self): """出佇列""" return self.items.pop() def size(self): """返回大小""" return len(self.items) if __name__ == "__main__": q = Queue() q.enqueue("one") q.enqueue("two") q.enqueue("three") print(q.size()) print(q.dequeue()) print(q.dequeue()) print(q.dequeue())
3.雙端佇列
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
class Deque(object): """雙端佇列""" def __init__(self): self.items = [] def is_empty(self): """判斷佇列是否為空""" return self.items == [] def add_front(self, item): """在隊頭新增元素""" self.items.insert(0,item) def add_rear(self, item): """在隊尾新增元素""" self.items.append(item) def remove_front(self): """從隊頭刪除元素""" return self.items.pop(0) def remove_rear(self): """從隊尾刪除元素""" return self.items.pop() def size(self): """返回佇列大小""" return len(self.items) if __name__ == "__main__": deque = Deque() deque.add_front(1) deque.add_front(2) deque.add_rear(3) deque.add_rear(4) print(deque.size()) print(deque.remove_front()) print(deque.remove_front()) print(deque.remove_rear()) print(deque.remove_rear())
以上三種結構實現使用了python內建資料結構列表的操作,程式碼很簡單主要是幫助自己理解概念。
有關python內建資料結構,大家可以去菜鳥教程看看,有詳細的介紹 http://www.runoob.com/python3/python3-data-structure.html