棧和隊列是兩種重要的線性結構。從數據結構的角度來看,棧和隊列也是線性表,它的特殊性在於棧和隊列的基本操做是線性表操做的子集,它們的操做相對於線性表來講是受到限制的,所以,能夠稱其爲限定性的數據結構。算法
從數據類型的角度看,它們是和線性表大不相同的兩種重要的抽象數據類型,在面向對象的程序設計中,它們是多型數據類型。數據結構
棧:是限定僅在表尾進行插入或刪除操做的線性表,又能夠稱爲後進先出的線性表。 函數
棧頂:棧的表尾端spa
棧底:棧的表頭端設計
空棧:不含元素的空表指針
和線性表類似,棧也有兩種存儲表示方法,即順序棧和鏈棧。對象
(1)棧的順序存儲遞歸
所謂棧的順序存儲,就是採用一組物理上連續的存儲單元來存放棧中全部元素,並使用top指針來指示當前棧中處於棧頂的元素。隊列
(1.1) 順序棧的基本操做:數學
-1:初始化棧函數的實現
-2:判斷棧是否爲空的函數實現
-3:進棧函數的實現
-4:出棧函數的實現
-5:獲取棧頂元素函數的實現
-6:遍歷棧內元素函數的實現
-7:經過用戶輸入數據的方式建立一個順序棧
(2)棧的鏈式存儲
棧的順序存儲一般要求系統分配一組連續的存儲單元,在實現時,對於某些語言而言,當棧滿後想要增長連續的存儲空間時沒法實現的。咱們能夠經過鏈式存儲來實現須要多少存儲空間就申請多少存儲空間,這減低空間使用的浪費率。
(2.1)鏈棧的基本操做
-1:初始換鏈棧函數的實現
-2:判斷鏈棧是否爲空函數的實現
-3:進棧函數的實現
-4:出棧函數的實現
-5:獲取棧頂元素函數的實現
-6:經過用戶輸入的方式創一個鏈棧
與棧同樣,隊列也是一種特殊的線性表,不一樣的是,隊列在進行數據操做是必須遵循「先進先出」的原則,這一特色決定了隊列的進本操做須要在其兩端進行。
隊列的基本操做一般在隊列兩端被執行,其中執行插入元素操做的一端被稱爲隊尾;執行刪除元素操做的一段被稱爲隊頭。隊列中的元素個數就是隊列的長度,若隊列中不包含任何元素,則被稱爲隊空,若隊列中沒有可用空間存儲待進隊元素,此時咱們稱爲隊滿。
隊列的順序存儲是指採用一組物理上連續的存儲單元來放隊列中的全部元素。爲了便於計算隊列中的元素個數,咱們約定,隊頭指針指向實際隊頭元素所在位置的前一位置,對位指針指向實際隊尾元素所在的位置。
(1)初始化隊列函數的實現
(2)判斷隊列是否爲空函數的實現
(3)元素進隊函數的實現
(4)元素出隊函數的實現
(5)獲取隊頭元素的實現
(6)經過用戶輸入數據的方式建立一個順序隊列
(1)元素進隊函數的實現
(2)元素出隊函數的實現
(3)經過用戶輸入的方式建立一個循環順序隊列
(1)建立鏈式隊列函數的實現
(2)判斷隊頭指針和隊尾指針是否爲空函數的實現
(3)進隊函數的實現
(4)出對函數的實現
(5)獲取隊頭元素函數的實現
(6)經過用戶輸入數據的方式建立一個隊列
循環鏈式隊列是將鏈式隊列的隊尾指針所在的結點指向頭結點。因爲頭結點的下一個結點就是隊頭元素所在獲得位置,而隊尾指針所在的結點又指向頭結點,因此由隊尾指針也能夠找到隊頭元素,所以在循環鏈式隊列中咱們不須要再增設隊頭指針。
遞歸是數學中一個十分重要的概念,它也被大量應用在計算技術中,其特徵爲直接或間接調用自身,咱們一般把一函數調用自身稱爲遞歸,不然稱爲間接遞歸。在算法設計中,任何間接遞歸均可以轉化爲直接遞歸來實現。