資料結構中棧一些需要注意的地方
1. 棧的定義
棧(stack)是限定在僅在表尾進行插入和刪除操作的線性表。我們把允許插入和刪除的一端稱為棧頂(top),另一端稱為棧底(bottom),不含任何資料元素的棧稱為空棧。棧又成為後進先出的線性表。
棧的插入操作,叫作進棧,也稱壓棧、入棧;棧的刪除操作,叫作出棧,也有的見彈棧。
2. 棧的抽象資料型別
對於棧來說,理論上線性表的操作特性它都具備,可由於它的特殊性,所以針對它的操作上會有些變化。特別是插入和刪除操作,我們改名為push和pop,進棧和出棧。
3. 棧的順序儲存結構及實現
棧的順序儲存結構其實也是線性表順序儲存的簡化,簡稱順序棧。用陣列來說,我們把下標為0的一段端作為棧底,因為首元素都存在棧底,變化最小。我們對順序棧最基本的兩個操作就是進棧操作和出棧操作。
4. 兩棧的共享空間
順序棧非常方便,因為它只准棧頂進出元素,所以不存線上性表插入和刪除時需要移動元素的問題。但它有一個很大的缺陷,就是必須實現確定陣列儲存空間大小,一旦不夠用,我們就需要程式設計手段來擴充套件陣列的容量。但對於兩個相同型別的棧,我們可以做到最大限度地利用其事先開闢的儲存空間來進行操作。
做法如下:陣列有兩個端點,兩個站有兩個底棧,讓一個棧的棧底為陣列的始端,即下標為0處,另一個個棧為棧的末端,即下標為陣列長度n - 1處。這樣,兩個棧如果增加元素,就是兩端點向中間延伸。
5. 棧的鏈式儲存結構及實現
棧的鏈式儲存結構簡稱為鏈棧。我們把棧頂放在單鏈的頭部,對於鏈棧來說,是不需要頭結點的。
鏈棧中的基礎操作也是進棧和出棧操作。
6. 順序棧和鏈棧
兩個棧在時間複雜度上是一樣的,均為O(1)。對於空間效能,順序棧需要事先確定一個固定的長度,可能會存在記憶體空間浪費的問題,但它的優勢是存取時定位很方便,而鏈棧則要求每個元素獨有指標域,這同時也增加例一些記憶體開銷,但對棧的長度沒有限制。
關於兩者之間的選擇,如果棧的使用過程中元素變化不可預料,有時很小,有時很大,那麼最好用鏈棧,反之,如果它的變化在可控範圍之內,建議使用順序棧會好一些。
7. 棧的作用
棧的引入簡化例程式設計的問題,劃分了不同關注層次,是的思考範圍縮小,更加聚焦於我們要解決的問題核心。棧有一個很重要的應用:在程式語言中實現例遞迴。
8. 遞迴
我們把一個直接呼叫自己或通過一系列的呼叫語句間接地呼叫自己的函式,稱為遞迴函式。每個遞迴定義必須至少有一個條件,滿足時遞迴不再進行,即不再引用自身而是返回值退出。
9. 遞迴和迭代的區別
迭代使用的是迴圈結構,遞迴使用的是選擇結構。遞迴能使程式的結構更清晰、更簡潔、更讓人理解,從而減少讀懂程式碼的時間。但大量的遞迴呼叫會建立函式的副本,會耗費大量的時間和記憶體。迭代則不需要反覆呼叫函式和佔用額外的記憶體。因此我麼應該視不同的情況選擇不同的程式碼實現方式。
10. 遞迴和棧的關係
遞迴過程退回的順序是它前行順序的逆序。在退回過程中,可能要執行某些動作,包括回覆在前行過程中儲存起來的某些資料。這種儲存某些資料,並在後面又以儲存的逆序恢復這些資料,以提供之後使用的需求,顯然很符合棧這樣的資料結構。zhon