🧱用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

留言
avatar-img
小松鼠的演算法樂園
98會員
428內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
2024/10/10
從Python 內建deque資料結構的角度切入, 同時了解deque 與 FIFO Queue相關的function用法。 collections.deque是一種兩端點皆可進出的雙端佇列 在兩端點高效地在O(1)常數時間內添加和刪除元素。 這使得deque非常適合實現FIFO Queue
Thumbnail
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/09/27
井字遊戲(OOXX)的遊戲描述 Tic Tac Toe(井字遊戲)是經典的雙人棋盤遊戲,在一個3x3的方格中進行。 每回合兩個玩家輪流選一個位置,先讓自己的符號(是 X 或 O)在 水平線、垂直線或對角線上連成一線的玩家宣告獲勝。
Thumbnail
2024/09/23
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
2024/09/23
深入探討圖(Graph)的基本概念 及 最短路徑Shortest Path的尋找。 我們專注於廣度優先搜尋(BFS)演算法,以等權圖的最短路徑為例, 詳細說明如何利用BFS從起點擴散到終點,並且提供詳細的程式碼範例。 透過實作,讀者能夠更清楚理解圖論及BFS的應用,並體會水波紋擴散模型的重要性。
Thumbnail
看更多
你可能也想看
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
在 vocus 與你一起探索內容、發掘靈感的路上,我們又將啟動新的冒險——vocus App 正式推出! 現在起,你可以在 iOS App Store 下載全新上架的 vocus App。 無論是在通勤路上、日常空檔,或一天結束後的放鬆時刻,都能自在沈浸在內容宇宙中。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
vocus 慶祝推出 App,舉辦 2026 全站慶。推出精選內容與數位商品折扣,訂單免費與紅包抽獎、新註冊會員專屬活動、Boba Boost 贊助抽紅包,以及全站徵文,並邀請你一起來回顧過去的一年, vocus 與創作者共同留下了哪些精彩創作。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
今天來介紹python的函式 函式在python中是非常重要的一環,因為到了後期,程式會越來越複雜。 而函式可以想成是容易管理的小程式,當我們需要使用時,只需呼叫即可。
Thumbnail
古有四大名著,現今Python四大容器🤣 哪四個?list串列,tuple元組,dict字典,set集合。 那這四個怎麼分? 一起來看看吧! (以下有手寫與上機實際測試請付費觀看) 以上我精心整理主要會使用到的功能 當然python功能太多了,肯定不只。 實際操作: 大概就這樣?(
Thumbnail
古有四大名著,現今Python四大容器🤣 哪四個?list串列,tuple元組,dict字典,set集合。 那這四個怎麼分? 一起來看看吧! (以下有手寫與上機實際測試請付費觀看) 以上我精心整理主要會使用到的功能 當然python功能太多了,肯定不只。 實際操作: 大概就這樣?(
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
在Python中,queue是一個非常有用的模块。 它提供了多種佇列(queue)實現,用於在多線程環境中安全地交換信息或者數據。 佇列(queue)是一種先進先出(FIFO)的數據結構,允許在佇列的一端插入元素,另一端取出元素。(FIFO 是First In, First Out 的縮寫)
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
先前學到自定函式的使用方法,那如果在一個很龐大的程式架構中發散了一推自定函式,有沒有辦法可以整理一下,讓程式結構整齊又簡潔呢? 可以使用裝飾器staticmethod 定義靜態方法,全部整理到一個類別去,想像成是一個工具箱的概念,工具箱就是類別,靜態方法就像是裡面的工具一樣。
Thumbnail
本文介紹了Python中zip與enumerate函式的使用,以及它們的語法說明和程式範例。zip函式允許同時迭代多個可迭代對象,這使得程式碼更簡潔;而enumerate函式則在迭代時,提供元素的索引,使得實用工具,尤其是當需要追蹤元素的位置時。
Thumbnail
本文介紹了Python中zip與enumerate函式的使用,以及它們的語法說明和程式範例。zip函式允許同時迭代多個可迭代對象,這使得程式碼更簡潔;而enumerate函式則在迭代時,提供元素的索引,使得實用工具,尤其是當需要追蹤元素的位置時。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
本文介紹了串列運算式的應用,以及與Lambda匿名函式方法的比較,並提供了程式範例。串列運算式提供了一種簡潔的語法,用於創建、轉換和過濾列表。lambda函式用於創建匿名函式,通常用於簡單的操作。建議在比較複雜的情況下使用一般for迴圈加if來表示。
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
列表(List)和元組(Tuple)都是 Python 中用來存儲集合元素的數據結構,兩者看起來很像,在初學時很容易搞混,所以觀念要建立好。 可以把列表(List)和元組(Tuple)想像成是一個容器,什麼元素都可以塞
Thumbnail
本文讓我們來淺談一下類別是什麼? 若想看詳細一點的python官方教學可點此連結 Python 的類別(Class)是一種面向物件導向程式設計的概念,讓你能夠創建具有屬性和方法的物件。類別是對現實世界中事物的抽象,它包含數據和操作這些數據的方法。它非常的抽象,想像一個類別就像是一個蛋糕模具,
Thumbnail
本文讓我們來淺談一下類別是什麼? 若想看詳細一點的python官方教學可點此連結 Python 的類別(Class)是一種面向物件導向程式設計的概念,讓你能夠創建具有屬性和方法的物件。類別是對現實世界中事物的抽象,它包含數據和操作這些數據的方法。它非常的抽象,想像一個類別就像是一個蛋糕模具,
Thumbnail
在 Python 中,List、Set、Tuple 和 Dictionary 都是常用的資料結構,它們各自具有不同的特性和用途,在本篇學習筆記中,我們將比較這四種資料結構,介紹它們的特點、用法以及適用的場景,幫助你更好地理解它們的差異和選擇適當的資料結構。
Thumbnail
在 Python 中,List、Set、Tuple 和 Dictionary 都是常用的資料結構,它們各自具有不同的特性和用途,在本篇學習筆記中,我們將比較這四種資料結構,介紹它們的特點、用法以及適用的場景,幫助你更好地理解它們的差異和選擇適當的資料結構。
Thumbnail
本章介紹第二種常見的資料結構 - 堆疊(Stack),與陣列建立方式雷同,我們常透過靜態串列與動態鏈結串列的方式來建立堆疊,本文會介紹實作過程與比較兩種方式之間的差異。
Thumbnail
本章介紹第二種常見的資料結構 - 堆疊(Stack),與陣列建立方式雷同,我們常透過靜態串列與動態鏈結串列的方式來建立堆疊,本文會介紹實作過程與比較兩種方式之間的差異。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News