你家中有洗衣籃嗎?我自己習慣是等衣服堆疊累積到週末,會發現最後丟進洗衣籃的衣服, 最先被拿出來。
抽象資料型態
堆疊是一種抽象資料型態 (Abstract Data Type, ADT),看到抽象內心是否有一種滿頭問號的感覺,就比如說當你聽到水果,會覺得水果抽象嗎?指的到底是蘋果還是香蕉呢?當描述是指一個大的範圍,不夠仔細、不夠具體的時候,其實就是一種抽象化的名詞。
如果你跟同事說,我買了一台車,那同事可能會進一步問你,你買機車還是汽車?買什麼牌子?是轎車來是休旅車?所以車其實也是一種抽象類別,隱藏了許多內部細節,因為我們對於車子的認知大概是以下特性,只要可以符合這些特性,就可以稱為某一種車:
- 需要駕駛
- 可以發動
- 可以煞車
- 可以移動
- 可以載物
如果要具體的描述,應該是這樣說:我買了一台白色的五人座廠逢轎車,而抽象資料型態 (ADT),其實就是讓我們可以簡易的操作某些特有方法,而不用去在意細節是如何實作的,例如:今天不管開哪一種車,你只要知道如何啟動就好,不需要解引擎是如何製造或運作的,而抽象化就是要將這些不需要知道的細節隱藏起來,只需要知道能夠使用那些功能即可,例如車子的功能有啟動、煞車與熄火
其實抽象這個詞,在演講的時候也蠻常發生的,有時候演講聽著聽著就睡著了,其中可能的原因是,講者說話方式太抽象了,常常講到一些專有名詞,例如資料結構,涵蓋的是一個很大的範圍或觀念,然後腦袋就會慢慢無法思考,而進入睡眠模式,有些地方使用抽象很好 (例如一般民眾只要懂得如何開車,不需要懂車子的製造過程),但還是要看情況來選擇,如果今天是要對車廠進行員工訓練,那就必須做細節的解說
堆疊限制
- 只能從堆疊的
最頂端存取資料 - 只能從堆疊的
最頂端新增或刪除資料 - 資料的存取必須符合
後進先出(Last In First Out, LIFO)
- Create : 可建立一個空的堆疊
- Push : 可在頂端
新增資料,並得到一個新的堆疊 - Pop : 可
刪除頂端資料,並得到一個新的堆疊 - Peek : 回傳堆疊頂端的資料
實際應用
- 資料反序輸出,例如將由小到大的資料改成由大到小
- 迴文判斷
- 河內塔問題
- 括號配對
堆疊其實很像我們平常玩的撲克牌,發牌的時候只能從頂端開始,而後進先出的概念,在生活中存在很多例子,例如:冰箱的東西,
Queue
佇列跟堆疊很相似,不同於堆疊的是佇列可以在兩個端點去做新增與刪除
- 排隊的人龍:
最早排隊的人,最早領到口罩,越晚到的人,等待時間越久
櫃台人員忙著發口罩,但民眾卻一直源源不絕的排隊,形成一邊在減少,一邊在追加的形況,那你還有什麼也是一邊在減少,一邊在增加的例子嗎?像某些停車場,也有規劃一進一出的通道
-
有兩個端點,分為
前端與後端 -
後端只可
新增資料 -
前端只可
刪除與讀取資料 -
資料的存取必須符合
先進先出(First In First Out, FIFO) -
優先佇列
可應用在系統的作業排程上,比如在排隊的時候,有一些持有 VIP 的人,他們就可以插隊,變成優先處理,不需要符合 FIFO 特性