Python資料結構與演算法系列四:棧和佇列
1. 棧
1.1 定義
棧(stack),有些地方稱為堆疊,是一種容器,可存入資料元素、訪問元素、刪除元素,它的特點在於只能允許在容器的一端(稱為棧頂端指標,英語:top)進行加入資料(英語:push)和輸出資料(英語:pop)的運算。沒有了位置概念,保證任何時候可以訪問、刪除的元素都是此前最後存入的那個元素,確定了一種預設的訪問順序。
由於棧資料結構只允許在一端進行操作,因而按照後進先出(LIFO, Last In First Out)的原理運作。
1.2 棧結構實現
棧可以用順序表實現,也可以用連結串列實現。
1.2.1 棧的操作
Stack() 建立一個新的空棧
push(item) 新增一個新的元素item到棧頂
pop() 彈出棧頂元素
peek() 返回棧頂元素
is_empty() 判斷棧是否為空
size() 返回棧的元素個數
class Stack(object):
"""棧"""
def __init__(self):
self.__list = []
def push(self, item):
"""新增一個新的元素item到棧頂"""
self.__list.append(item)
def pop(self):
"""彈出棧頂元素"""
return self.__list.pop()
def peek(self):
"""返回棧頂元素"""
if self.__list:
return self.__list[-1]
else:
return None
def is_empty(self):
"""判斷棧是否為空"""
return self.__list == []
# return not self.__list
def size(self):
"""返回棧的元素個數"""
return len(self.__list)
1.2.3 測試
if __name__ == "__main__":
s = Stack()
s.push(1)
s.push(2)
s.push(3)
s.push(4)
print(s.pop())
print(s.pop())
print(s.pop())
print(s.pop())
2. 單端佇列
佇列(queue)是隻允許在一端進行插入操作,而在另一端進行刪除操作的線性表。
佇列是一種先進先出的(First In First Out)的線性表,簡稱FIFO。允許插入的一端為隊尾,允許刪除的一端為隊頭。佇列不允許在中間部位進行操作!假設佇列是q=(a1,a2,……,an),那麼a1就是隊頭元素,而an是隊尾元素。這樣我們就可以刪除時,總是從a1開始,而插入時,總是在佇列最後。這也比較符合我們通常生活中的習慣,排在第一個的優先出列,最後來的當然排在隊伍最後。
2.1 實現
同棧一樣,佇列也可以用順序表或者連結串列實現。
2.1.1 操作
Queue() 建立一個空的佇列
enqueue(item) 往佇列中新增一個item元素
dequeue() 從佇列頭部刪除一個元素
is_empty() 判斷一個佇列是否為空
size() 返回佇列的大小
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)
2.2.2 測試
if __name__ == "__main__":
q = Queue()
q.enqueue("hello")
q.enqueue("world")
q.enqueue("itcast")
print (q.size())
print (q.dequeue())
print (q.dequeue())
print (q.dequeue())
3. 雙端佇列
雙端佇列(deque,全名double-ended queue),是一種具有佇列和棧的性質的資料結構。
雙端佇列中的元素可以從兩端彈出,其限定插入和刪除操作在表的兩端進行。雙端佇列可以在佇列任意一端入隊和出隊。
3.1 操作
Deque() 建立一個空的雙端佇列
add_front(item) 從隊頭加入一個item元素
add_rear(item) 從隊尾加入一個item元素
remove_front() 從隊頭刪除一個item元素
remove_rear() 從隊尾刪除一個item元素
is_empty() 判斷雙端佇列是否為空
size() 返回佇列的大小
3.2 實現
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資料結構演算法佇列
- 《資料結構與演算法》——表、棧和佇列資料結構演算法佇列
- 資料結構與演算法-棧與佇列資料結構演算法佇列
- 資料結構-棧與佇列資料結構佇列
- 資料結構—棧和佇列資料結構佇列
- 資料結構(棧和佇列)資料結構佇列
- 結構與演算法(02):佇列和棧結構演算法佇列
- 資料結構與演算法(二)佇列、棧、連結串列資料結構演算法佇列
- 資料結構-佇列、棧資料結構佇列
- C#資料結構與演算法2-C# 棧和佇列C#資料結構演算法佇列
- 資料結構二之棧和佇列資料結構佇列
- 【資料結構】棧(Stack)和佇列(Queue)資料結構佇列
- python演算法與資料結構-佇列(44)Python演算法資料結構佇列
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 資料結構與演算法—稀疏陣列和佇列資料結構演算法陣列佇列
- 資料結構-js實現棧和佇列資料結構JS佇列
- 資料結構與演算法-佇列資料結構演算法佇列
- 前端學習 資料結構與演算法 快速入門 系列 —— 佇列和雙端佇列前端資料結構演算法佇列
- 資料結構與演算法——佇列(環形佇列)資料結構演算法佇列
- IT名企演算法與資料結構題目最優解--棧和佇列演算法資料結構佇列
- 【資料結構】棧和佇列的總結對比資料結構佇列
- 畫江湖之資料結構【第二話:佇列和棧】佇列資料結構佇列
- 畫江湖之資料結構 [第二話:佇列和棧] 佇列資料結構佇列
- 重溫四大基礎資料結構:陣列、連結串列、佇列和棧資料結構陣列佇列
- 學習JavaScript資料結構(一)——棧和佇列JavaScript資料結構佇列
- JavaScript資料結構之陣列棧佇列JavaScript資料結構陣列佇列
- javascript資料結構與演算法-佇列JavaScript資料結構演算法佇列
- 資料結構與演算法分析——佇列資料結構演算法佇列
- 畫江湖之資料結構【第二話:佇列和棧】棧資料結構佇列
- 畫江湖之資料結構 [第二話:佇列和棧] 棧資料結構佇列
- 資料結構和演算法(六)佇列資料結構演算法佇列
- 資料結構基礎學習之(棧和佇列)資料結構佇列
- 大二資料結構學習3(棧和佇列)資料結構佇列
- 線性結構 佇列與棧佇列
- python演算法與資料結構-棧(43)Python演算法資料結構
- 資料結構與演算法實驗1——線性表的應用之棧與佇列資料結構演算法佇列
- js資料結構與演算法 陣列、棧部分JS資料結構演算法陣列
- 資料結構與演算法-資料結構(棧)資料結構演算法