Java 實作 Stack - 使用陣列

前情提要

先吐嘈老師根本喪心病狂w

昨天物件導向正式上課跟上機(雖然我都上自己的機),
一開始老師簡單介紹了 Java 基本操作,畢竟這年頭 Java 不是必修課(?);
然後就出了三個作業:(萬年不變的)Hello world、運算子運用,
最後一個就是今天的主角:實作 Stack

如果說有學過 Java 可能會知道,java.util 有個 package 叫 Stack 就是用來實作 stack 的,
但老師笑容可掬的說:「請用 array 實作喔。
差點在教室尖叫。

基本知識

Stack / 堆疊,顧名思義就是把資料「堆」上去的結構,所以有以下特性:

  1. 先進後出 / 後進先出(LIFO, Last In First Out
  2. 除了頭尾外的每個節點都有「前綴」與「後繼」

對於 stack 的操作通常有以下兩種方法:

  • push:將資料存入 stack 頂端
  • pop:將 stack 頂端資料移除,頂端移到下一筆資料

題目

請以一維陣列實作 stack,其中元素(elements)儲存於 stack[0]stack[top] 之間。

實作

這次除了實作 stack 的操作,
還要實作顯示頂端資料(top())、判斷 stack 是否為滿(isFull())或空(isEmpty())、pop 全部資料(popall()),
一開始想說把資料頂端定義為 stack[0],但發現用以前學 C 的概念會讓自己寫出一堆無用跟充滿 bug 的程式碼,
後來發現自己題目沒看清楚(見「題目」),才發現頂端是 stack[top]
所以可以設定一個頂端索引值(top),並初始為 -1 讓操作較為輕鬆。
這告訴我們題目一定要看清楚。

判斷是否為滿或空

  • isFull():stack 如果滿的時候,top 值會等於 4(因為大小設為 5,故堆滿時頂端索引為 5 - 1 = 4),故判斷 top 是否等於 MAX_STACK_SIZE - 1 即可。
  • isEmpty():stack 裡面沒有資料時,top 會小於 0(詳見 pop() 實作),故僅需要判斷 top 是否小於 0 即可判斷。

Stack push

先判斷 stack 是不是已經堆滿,若是則警告;否則就將元素放入頂端。
放入的方式必須遵循 LIFO 的原則(不然就不是 stack 了),
故 push 進去的資料在陣列中索引值一定是 top
而初始 stack 為空時 top 是 -1,所以一開始要先讓它成為 0(++top),
後續 push 進去的索引則依序增加。

Stack pop

pop() 方法是要「取出」頂端的資料,
所以先判斷 stack 是否為空(不然沒資料怎麼 pop?),接著將頂端索引值 -1 即可(top--),
這是因為沒有索引就等於存取不到資料,「形同」刪除資料。(這樣比較容易理解啦w)

顯示頂端資料

pop(),需要先判斷 stack 是否為空(沒資料顯示個鬼),接著存取頂端的資料並印出。

pop 全部資料

這部份要求連續顯示頂端資料並且 pop 該筆資料,直到 stack 為空;
既然已經有 pop() 方法就不需要另外刻一個 pop 資料的 feature,
直接利用迴圈跑 pop() 就可以了www,迴圈判斷就是檢查 stack 是否為空,若空(isEmpty() == true)則停止迴圈。

結論

首先你得先調教好你的編輯器(應該下一篇文章會來聊這件事)

用 Java 實作資料結構的體驗還蠻新鮮的,雖然其實我資料結構還沒開始上課(o);

然後學習資料結構的過程其實蠻有趣的,會讓以前寫 procedure function 的壞習慣減少很多,
能夠用更簡潔與快速的方式對資料進行操作,不只 code 會乾淨漂亮,維護也比較容易。

老師預告下週會用物件的概念實作 stack,屆時再來看看有什麼不同之處吧!

火山 / Kazan
2022.09.20