🧱用Python list 來實現 Stack(堆疊)

閱讀時間約 1 分鐘

在之前的教學中,已經學會了用雙向鏈結串列來實作Stack 堆疊

今天,要用另一種底層資列結構,python list,來實作Stack 堆疊。

讀者可以從中發現,因為python list的功能和function實作已經很豐富,
所以使用起來,相當直覺,也簡單許多。


定義

是一個線性長條狀的資料結構。

規定推入資料取出資料都必須在頂端TOP操作。

(就像餐廳疊盤子,或者,書桌上疊書本的那種感覺。)

也由於這項規定,Stack先天具有先進後出First-in Last-out的這種特質。

raw-image


支援的操作與介面


stack.push(data)


推入一筆新資料data進入stack的頂端。

raw-image


stack.top()


取得stack頂端目前的資料。

raw-image


stack.pop()


取得stack頂端目前的資料,並且將此資料從stack頂端移除。

raw-image


len( stack )


取得stack的大小,也就是現在有幾筆資料存在stack裡。

raw-image


stack.is_empty()


判斷stack是否為空。

raw-image


優點

1.在頂端新增、取得、移除資料是O(1) 常數時間

2.可以根據需求動態延伸或縮短,有效利用記憶體空間。

缺點

1.不支援random acess,不支援Stack[ index ] 這種操作。

2.如果要取得下層的資料,必須先將頂端的資料移除


Stack的class定義 與 建構子(初始化函式)

class Stack:

def __init__(self):
self.stack = list()

Stack常見的function實現


1.在stack頂端插入新元素


直接在stack頂端放入新元素,對應的底層實作就是在python list尾巴串上新資料。


時間複雜度: O(1) 常數時間

  def push(self, data):

self.stack.append(data)
return

2.讀取stack頂端元素


直接返回stack頂端的元素,對應的底層實作就是返回python list尾巴的資料。

實作上有個細節需要留意,假如stack是空的,直接返回None即可。


Pyhon 的索引與法相當靈活,除了支援順著數的0, 1, 2, ..., n-1之外;

還支援逆著數的-1, -2, -3, ..., -n。


self.stack[-1]就相當於 self.stack[ len(self.stack)-1 ]

回傳陣列尾巴的最後一個元素


時間複雜度: O(1) 常數時間

  def top(self):
if self.is_empty():
return None

return self.stack[-1]

3.從stack頂端取出舊元素


直接返回並且移除stack頂端的元素,

對應的底層實作就是在返回並且移除python list尾巴的資料。


時間複雜度: O(1) 常數時間

  def pop(self):

if self.is_empty():
return None

return self.stack.pop()

4.取得stack的長度


返回stack的長度,也代表stack內部資料的總數量。

對應的底層實作就是在返回串列的長度。


時間複雜度: O(1) 常數時間

  def __len__(self):

    return len(self.stack)

5.檢查stack是否為空


如果stack 的長度為0,代表stack是空的,內部沒有任何資料。


時間複雜度: O(1) 常數時間

  def is_empty(self):

return 0 == len( self.stack )

完整的Stack實作和程式碼,底層是Python list。

class Stack:

  def __init__(self):
    self.stack = list()

  def push(self, data):
    self.stack.append(data)
    return


  def pop(self):

    if self.is_empty():
      return None

    return self.stack.pop()


  def top(self):
    if self.is_empty():
      return None

    return self.stack[-1]


  def is_empty(self):
    return 0 == len( self.stack )


  def __len__(self):
    return len(self.stack)

  def __contains__(self, item):
    return item in self.stack

  def traverse(self):
    for element in self.stack:
      print(element, end = "->")

    print()
    return

def test():

  print(f"Empty stack\n")
  stack = Stack()

  for i in range(1, 5):
    print(f"Push {i}...")
    stack.push(i)

  print()
  print(f"Is stack empty? {stack.is_empty()}")
  print(f"Size of stack: { len(stack) } ")
  print()

  for i in range(1,6):
    print(f"Is {i} in stack? = { i in stack}")

  print()
  stack.traverse()

  for i in range(4):
    print(f"Top of stack = {stack.top()}")
    print(f"pop {stack.top()}")
    stack.pop()

  print(f"Is stack empty? {stack.is_empty()}")

  return

if __name__ == "__main__":
  test()

測試輸出

Empty stack

Push 1...
Push 2...
Push 3...
Push 4...

Is stack empty? False
Size of stack: 4

Is 1 in stack? = True
Is 2 in stack? = True
Is 3 in stack? = True
Is 4 in stack? = True
Is 5 in stack? = False

1->2->3->4->
Top of stack = 4
pop 4
Top of stack = 3
pop 3
Top of stack = 2
pop 2
Top of stack = 1
pop 1
Is stack empty? True

結語


這篇我們透過python list作為底層的輔助資料結構,
來實現完整的Stack class 和 interface function。

讀者可以搭配先前的教學文章,一起復習相關的資料結構。


Stack相關的演算法練習題與詳解


Stack堆疊應用題 合法括號配對字串 Leetcode #20_Valid Parentheses


一魚多吃 用stack來解 最長合法括弧字串 Leetcode #32 Longest Valid Parenthese


應用題 用Stack實作Queue_Leetcode #232 Implement Queue using Stacks


一魚多吃 用stack來解 Backspace String Compare_Leetcode #844


一魚多吃 用stack來驗證 合法括弧字串 678. Valid Parenthesis String


用stack 模擬陣列生成 Build Array w/ Stack Operations_Leetcode 1441

78會員
413內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作, 把常用的功能包裝成可重複利用的元件: function。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
在資料結構與演算法裡, 最簡單的線性資料結構除了array之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list
在這次的BMI(身體質量指標)計算教學裡, 將學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
在這次的BMI(身體質量指標)計算的續集裡,將學會funciton的基本觀念與實作, 把常用的功能包裝成可重複利用的元件: function。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Queue(佇列 或稱 隊列)。
在之前的教學中,已經學會了Node和Linked List的實作, 用Python實現了單向鏈結串列Singly linked list、雙向鏈結串列Doubly linked list。 今天要承接之前打下的基礎,用雙向鏈結串列來實作Stack 堆疊。
在資料結構與演算法裡, 最簡單的線性資料結構除了array之外就是linked list鏈結串列了。 Linked list又有分為單向Singly linked list 和雙向Doubly linked list
在這次的BMI(身體質量指標)計算教學裡, 將學會如何用python來接收使用者輸入的訊息,並且做一些簡單的四則運算。
從範例學python的目標讀者: 針對剛進入的初學者,想學習Python語言。 有基礎本數學邏輯基礎即可。 從小遊戲學python的目標讀者: 針對已經有經驗的C/C++, Python, 或其他有程式基礎的讀者。 想實作一些小專案,從實做中學習如何分析需求、元件分拆、到底層實作
你可能也想看
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
八十-二十法則提到,在多數生活的現象中,約80%的效果是來自於20%的原因,除了經濟學、學習理論外,這個法則同樣也可以應用在生活中的幸福感上。 我們需要認知到擁有的越多不一定會越快樂,反而有可能會因為無法專注在少數事物上而產生空虛、迷茫的感覺。「極簡」精神最重要的一點在於放下對於「多」的執著,將有
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
上兩篇有關List的文章,此篇文上兩章的延續,整理一些常用的方法和操作。 [Python]List(列表)新增、修改、刪除元素 [Python基礎]容器 list(列表),tuple(元組) 還有一些常用的 list 方法和操作,讓你能更靈活地處理列表數據
Thumbnail
Python資料視覺化在數據分析中扮演關鍵角色,透過視覺化捕捉數據模式、趨勢和異常,透過Matplotlib等工具創建專業圖表變相對簡單和高效。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。