從Python認識資料結構(五).堆疊

更新於 發佈於 閱讀時間約 4 分鐘
本章節介紹第二種資料結構 - 堆疊( Stack )

本章節介紹第二種資料結構 - 堆疊( Stack )

大家好,本章會介紹以Python語言來實作第二種資料結構 - 堆疊(Stack),堆疊的概念很簡單,就如同疊盤子,通常會依序一個一個往上疊高,如果要取出時,也會拿最上面的那個盤子,這樣的形態我們將它命名為後進先出(Last In First Out),最早被放置的盤子放在最底下,越晚被放置的盤子則越靠上,而且會被優先拿取。


5-1、堆疊的基本操作

在Python語言中,堆疊的實作會與陣列相同,分別可以以靜態結構-串列(List)和動態結構 - 鏈結串列(Linked List)來建構。首先我們先來介紹堆疊的幾個基本操作。

  1. 創建(create):顧名思義,建立一個新的空堆疊
  2. 新增(push):將資料放入堆疊中,該資料會成為最頂部的資料
  3. 拿取(pop):將最頂部的資料移出
  4. 是否為空堆疊(isEmpty):用來檢查某堆疊是否為空
  5. 是否為滿堆疊(isFull):用來檢查某堆疊是否為滿

5-2、以串列方式來建立堆疊

以串列來建立堆疊的方式十分簡單,首先設計一個變數用來判斷目前堆疊內的資料儲存高度,我們選用top這個變數來儲存,並在創建新堆疊時將top變數賦值0,代表目前沒有任何資料。如同我們在陣列實作時的情況,若所需儲存空間未知,透過串列方式所建立的堆疊會造成記憶體空間的浪費。為了讓讀者們更了解堆疊的內容,我們直接定義幾種不同的函數來實作堆疊。

  • 是否為滿堆疊(isFull):為了避免資料新增時超出堆疊上限,我們必須先判斷當前堆疊是否已為滿堆疊,做法為判斷top和max之間的關係,如果top大於max,代表堆疊已滿,此時便不可再加入任何資料。
  • 新增(push):新增資料前要先判斷完是否為滿堆疊,若否,則可將資料放入堆疊中。做法為list[top]=欲新增的元素,新增完成後要將頂端往上疊,所以還要再讓top=top+1
  • 是否為空堆疊(isEmpty):為了避免拿取資料時發生錯誤,我們也要避免在空堆疊中發生拿取的命令,故我們判斷當前的堆疊情況,此時我們同樣可以運用上面提到的top變數,當top等於0時,代表當前沒有任何資料,也就是堆疊為空。
  • 拿取(push):拿取資料前同樣要判斷堆疊是否為空,若否,則可取出資料。與新增做法雷同,拿取的話可用Python內建的語法pop,做法為list.pop(),最後再將top=top-1




5-3、以鏈結串列來建立堆疊

同樣的,若要以鏈結串列的方式來建立堆疊,我們一樣要和實作上述的功能,不同的是,因為我們採用動態結構,不用事先給定記憶體空間,所以無需設計isFull這個函數,因為鏈結串列中並不會有滿堆疊的情況發生。

我們同樣設計top變數來儲存堆疊狀況,預設None代表目前沒有任何資料節點,當有新資料進入時,將新資料的next屬性連接到top,完成新資料堆到頂部的設置,接著再把top改為新節點位置,如此一來便完成了push的功能。

pop同理,我們只須將top改為top的next屬性指向的節點位置,也就是將top下移一層,此時雖然我們沒有刪除最上層的節點,但也透過刻意丟失的技巧將最頂部節點移除,完成pop的功能。


以上部分就是Python中建立堆疊的方式介紹,因為堆疊的實作與陣列很像,部分細節就不再贅述,下一節我們會介紹堆疊的應用,有任何問題歡迎寄信至我的信箱或於底下留言和我討論。



參考書目

  1. 圖解資料結構 - 使用Python(第二版)
  2. 圖書演算法 - 使用Python
  3. Python3 物件導向程式設計 第二版
  4. 精通Python (第二版)



留言
avatar-img
留言分享你的想法!
avatar-img
炯男孩的沙龍
4會員
8內容數
本專題將以Python程式語言來實作資料結構,依序從陣列(Array)、堆疊(Stack)、佇列(Queue)、樹(Tree)到圖(Graph),透過不同方式來建立資料結構,並討論部分細節如:建構難度、記憶體空間、效率等等。
你可能也想看
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
大家好,我是一名眼科醫師,也是一位孩子的媽 身為眼科醫師的我,我知道視力發展對孩子來說有多關鍵。 每到開學季時,診間便充斥著許多憂心忡忡的家屬。近年來看診中,兒童提早近視、眼睛疲勞的案例明顯增加,除了3C使用過度,最常被忽略的,就是照明品質。 然而作為一位媽媽,孩子能在安全、舒適的環境
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
我的「媽」呀! 母親節即將到來,vocus 邀請你寫下屬於你的「媽」故事——不管是紀錄爆笑的日常,或是一直想對她表達的感謝,又或者,是你這輩子最想聽她說出的一句話。 也歡迎你曬出合照,分享照片背後的點點滴滴 ♥️ 透過創作,將這份情感表達出來吧!🥹
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
Array可以說是各種語言除了基本型別之外,最常用的資料型別與容器之一了。 Array 這種連續格子狀的資料結構,在Python要怎麼表達呢? 建立一個空的陣列 最簡單也最直接的寫法就是 array = [] # Python list [] 就對應到大家熟知的array 陣列型態的資料結
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
探索Python學習筆記中列表的建立、存取和常用方法。從使用中括號定義列表到了解索引、新增、刪除、修改等操作,並介紹append、remove、count等常用方法。
Thumbnail
資料集中除了陣列這個外,還有另一個好幫手就是List,它跟陣列很像,我們直接來看一下怎麼用: 它的語法: 1.給予值 (1)單一新增: (2)陣列式新增: 例子: 2.取值 (1)foreach迴圈方式 (2)單一取值 3.取得List有多少個內容值 4.排序 想要反轉就再使用↓ 5.插入 6.複製
Thumbnail
資料集中除了陣列這個外,還有另一個好幫手就是List,它跟陣列很像,我們直接來看一下怎麼用: 它的語法: 1.給予值 (1)單一新增: (2)陣列式新增: 例子: 2.取值 (1)foreach迴圈方式 (2)單一取值 3.取得List有多少個內容值 4.排序 想要反轉就再使用↓ 5.插入 6.複製
Thumbnail
陣列運用、擷取字串   對於陣列裡的內容值除了把資料存進去外,若想要知道陣列維度、陣列大小、複製陣列的值到另一個陣列中、清除陣列的值等等的相關處理,甚至比較常用到的可能還需要做資料排列、查找資料等等,此時C#有一些屬性方法可以幫助到我們,不用寫複雜的迴圈,來看一看有哪些吧~
Thumbnail
陣列運用、擷取字串   對於陣列裡的內容值除了把資料存進去外,若想要知道陣列維度、陣列大小、複製陣列的值到另一個陣列中、清除陣列的值等等的相關處理,甚至比較常用到的可能還需要做資料排列、查找資料等等,此時C#有一些屬性方法可以幫助到我們,不用寫複雜的迴圈,來看一看有哪些吧~
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
Array 在記憶體中連續分配,而且元素類型是一樣的,長度不變 優點:讀取快,可以使用座標訪問 缺點:新增、刪除慢 記憶體: 📷 範例程式碼: ArrayList 不定長度,在記憶體中連續分配的,元素沒有類型限制,任何元素都是當成object處理,如果是值類型,會有裝箱的操作 優點:讀取快 缺點:
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
本文會介紹靜態結構 - 串列(List)與動態結構 - 鏈結串列(Linked List)來實踐陣列的不同功能,如:刪除、計算元素個數與反轉。
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
本文延續從上一篇文章的內容,繼續來介紹如何分別以靜態結構 - 串列(List)及鏈結串列(Linked List)兩種不同的方式來建立實作陣列的新增及修改元素功能。
Thumbnail
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
Thumbnail
陣列是Python語言的最基礎也最容易實作的資料結構,主要可以透過兩種方式在Python上實踐陣列,其中一種是靜態結構 - 串列(List),另一種則是動態結構 - 鏈結串列(Linked List)。 我們會依序介紹這兩種作法如何在Python上執行陣列的相關功能,並比較兩種方法之間的差異。
Thumbnail
這篇我們來看一個在程式開發很常見也很常用的一個東西:Array 陣列 Array在所有的程式開發中還蠻常見的,也一定會出現,因為有很多的資料都會是一長串的,需要有一個物件來去做集中管理。
Thumbnail
這篇我們來看一個在程式開發很常見也很常用的一個東西:Array 陣列 Array在所有的程式開發中還蠻常見的,也一定會出現,因為有很多的資料都會是一長串的,需要有一個物件來去做集中管理。
Thumbnail
進入第4天教學,今天繼續學習基礎的教學,是跟容器型態(list、tuple、dict)、迴圈(while、for)相關的教學,迴圈是今天的重點,記得好好學習唷!!
Thumbnail
進入第4天教學,今天繼續學習基礎的教學,是跟容器型態(list、tuple、dict)、迴圈(while、for)相關的教學,迴圈是今天的重點,記得好好學習唷!!
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News