前情提要
先吐嘈老師根本喪心病狂w
昨天物件導向正式上課跟上機(雖然我都上自己的機),
一開始老師簡單介紹了 Java 基本操作,畢竟這年頭 Java 不是必修課(?);
然後就出了三個作業:(萬年不變的)Hello world、運算子運用,
最後一個就是今天的主角:實作 Stack。
如果說有學過 Java 可能會知道,java.util
有個 package 叫 Stack
就是用來實作 stack 的,
但老師笑容可掬的說:「請用 array 實作喔。」
差點在教室尖叫。
基本知識
Stack / 堆疊,顧名思義就是把資料「堆」上去的結構,所以有以下特性:
- 先進後出 / 後進先出(LIFO, Last In First Out)
- 除了頭尾外的每個節點都有「前綴」與「後繼」
對於 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