堆疊演算法(Stack) 是一種有序串列(即一群相同資料型態的組合),具有「後進先出」(Last In First Out, LIFO)的特性,故其所有的動作、資料的處理方式均在同一邊進行。而日常生活中處處可見堆疊的例子,例如將眾多書本裝箱後,若需要取出其中某一本書,就必須從最上面那本開始取出。像是這樣的例子在生活中常見,而以下將針對堆疊的定義、專有名詞、在算術上的運用等等概念進行說明和舉例介紹。
堆疊的定義整理
push
(加入)。pop
(取出)。push
和pop
這兩種動作皆發生於同一端,此端稱為top
(頂端)。top
端取出,無法從中間取出。堆疊常用名詞
常用名詞 | 含意 |
---|---|
push | 加入元素至頂端。 |
pop | 自頂端取出元素。 |
topItem | 查看頂端項目內容。 |
isEmpty | 判斷堆疊是否為空,回傳boolean值(True/False)。 |
isFull | 判斷堆疊是否為滿,回傳boolean值(True/False)。 |
堆疊在算術上的運用
在日常生活中,我們所使用的四則運算都屬於中序(infix order)運算式,意思就是運算子位於兩個運算元之間的表示法(A+B),而算術式可以表示為中序表示法(A+B)、前序表示法(+AB)和後序表示法(AB+)。由於中序表示法可能會含有括號,所以日常生活常用的中序式並不能直接的為電腦所用。因此,若要使用電腦來處理運算式,必須先將中序式轉換為後序式。以下的範例說明將針對「中序式轉換成前序式」兩種表示方法間的轉換與堆疊之關聯作說明:
【補充】常見的運算子優先順序
範例說明
中序式轉換成前序式
Tips:
運算式:A+B*C-D
Step1:讀取 ” ) ” ,放入堆疊。
此時堆疊:
Step2:讀取 ” D ” ,直接輸出。
此時輸出字串:D
Step3:讀取 ” - ” ,放入堆疊。
此時堆疊:
Step4:讀取 ” C ” ,直接輸出。
此時輸出字串:DC
Step5:讀取 ” ( ” ,依序輸出堆疊中運算子直到取出 ” ) ”。
此時堆疊:
此時輸出字串:DC-
Step6:讀取 ” * ” ,放入堆疊。
此時堆疊:
Step7:讀取 ” B ” ,直接輸出。
此時輸出字串:DC-B
Step8:讀取 ” + ” ,小於 ” * ” 優先權,將 ” * ” 輸出並將” + ” 放入堆疊。
此時堆疊:
此時輸出字串:DC-B*
Step9:讀取 ” A ” ,直接輸出。
此時輸出字串:DC-B*A
Step10:運算式讀取完成,將堆疊中所有運算子依序輸出。
此時堆疊:
此時輸出字串:DC-B*A+
Step11:反轉輸出的字串。
最終結果字串:+A*B-CD
中序式轉換成後序式
優點:
缺點:
參考資料: