堆疊 Stack,佇列,優先佇列

79 阅读3分钟

你家中有洗衣籃嗎?我自己習慣是等衣服堆疊累積到週末,會發現最後丟進洗衣籃的衣服, 最先被拿出來

image.png

抽象資料型態

堆疊是一種抽象資料型態 (Abstract Data Type, ADT),看到抽象內心是否有一種滿頭問號的感覺,就比如說當你聽到水果,會覺得水果抽象嗎?指的到底是蘋果還是香蕉呢?當描述是指一個大的範圍,不夠仔細、不夠具體的時候,其實就是一種抽象化的名詞。

如果你跟同事說,我買了一台車,那同事可能會進一步問你,你買機車還是汽車?買什麼牌子?是轎車來是休旅車?所以其實也是一種抽象類別,隱藏了許多內部細節,因為我們對於車子的認知大概是以下特性,只要可以符合這些特性,就可以稱為某一種車

  • 需要駕駛
  • 可以發動
  • 可以煞車
  • 可以移動
  • 可以載物

如果要具體的描述,應該是這樣說:我買了一台白色的五人座廠逢轎車,而抽象資料型態 (ADT),其實就是讓我們可以簡易的操作某些特有方法,而不用去在意細節是如何實作的,例如:今天不管開哪一種車,你只要知道如何啟動就好,不需要解引擎是如何製造或運作的,而抽象化就是要將這些不需要知道的細節隱藏起來,只需要知道能夠使用那些功能即可,例如車子的功能有啟動、煞車與熄火

其實抽象這個詞,在演講的時候也蠻常發生的,有時候演講聽著聽著就睡著了,其中可能的原因是,講者說話方式太抽象了,常常講到一些專有名詞,例如資料結構,涵蓋的是一個很大的範圍或觀念,然後腦袋就會慢慢無法思考,而進入睡眠模式,有些地方使用抽象很好 (例如一般民眾只要懂得如何開車,不需要懂車子的製造過程),但還是要看情況來選擇,如果今天是要對車廠進行員工訓練,那就必須做細節的解說

堆疊限制

  • 只能從堆疊的最頂端存取資料
  • 只能從堆疊的最頂端新增或刪除資料
  • 資料的存取必須符合後進先出 (Last In First Out, LIFO)
  1. Create : 可建立一個空的堆疊
  2. Push : 可在頂端新增資料,並得到一個新的堆疊
  3. Pop : 可刪除頂端資料,並得到一個新的堆疊
  4. Peek : 回傳堆疊頂端的資料

實際應用

  • 資料反序輸出,例如將由小到大的資料改成由大到小
  • 迴文判斷
  • 河內塔問題
  • 括號配對

堆疊其實很像我們平常玩的撲克牌,發牌的時候只能從頂端開始,而後進先出的概念,在生活中存在很多例子,例如:冰箱的東西,

Queue

佇列跟堆疊很相似,不同於堆疊的是佇列可以在兩個端點去做新增與刪除

  1. 排隊的人龍:最早排隊的人,最早領到口罩,越晚到的人,等待時間越久

櫃台人員忙著發口罩,但民眾卻一直源源不絕的排隊,形成一邊在減少,一邊在追加的形況,那你還有什麼也是一邊在減少,一邊在增加的例子嗎?像某些停車場,也有規劃一進一出的通道

image.png

image.png

  • 有兩個端點,分為前端後端

  • 後端只可新增資料

  • 前端只可刪除讀取資料

  • 資料的存取必須符合先進先出 (First In First Out, FIFO)

  • 優先佇列
    可應用在系統的作業排程上,比如在排隊的時候,有一些持有 VIP 的人,他們就可以插隊,變成優先處理,不需要符合 FIFO 特性