天天看點

【原創】【自制系列】自制stack類型(泛型)

自制類型的第三篇,stack類型。stack是指棧,其實我個人認為stack是最好寫的類型,沒有之一。關于queue類型需要涉及到循環隊列避免浪費記憶體,但是stack的插入删除都是對于棧頂而言,比較好寫。

自制類型的主要目的,是為了練習資料結構,提高寫代碼的能力。

s.empty() 判斷棧s是否為空

s.size() 傳回棧s的大小

s.push(a) 把a推入棧

s.pop() 彈出棧頂元素

s.top() 傳回棧頂元素

我們在使用标準庫的stack,是這樣寫的:

使用尖括号指定類型,就是泛型的一種。如果把int改為char,甚至是結構體等,都可以。

最簡單的例子:

這裡,max函數即可以處理int,又可以處理float,char類型的最大值。這就是泛型。max函數無論針對哪一個類型,操作都是相同的。是以,我們使用通用類型,讓函數不關注類型隻關注具體的操作。

有人會問,其實使用函數重載不就能完成了嗎?但是,函數重載要重複寫好幾次,不友善。

泛型的函數,可以使用template關鍵字寫:

template表示定義一個叫做T的類型,這個類型是一個通用類型。這個語句告訴編譯器,要開始泛型程式設計,其中T是要使用的泛型類型。

執行的時候,編譯器會自動根據參數的類型,把T轉換為int,float等類型,進行計算。

注意,泛型的函數不會進行自動類型轉換,例如<code>cout&lt;&lt;MAX('a',100);</code>這個語句,如果使用的是泛型類型,會編譯錯誤,但是使用普通類型不會報錯,因為普通類型的函數會進行自動類型轉換。

泛型類的寫法:

(轉自我之前寫過的《自制vector類型》)

這樣,就可以像标準庫一樣定義了。

在類的函數中,對于參數和部分類變量,也需要把類型指定為T,在malloc和realloc的強制轉型中也是T*。

将Data,nData初始化,變量的含義很簡單,不再多說。

判斷棧的大小即可。如果大小為0,表示為空棧。

傳回nData。

重頭戲

首先,把棧的大小加上1。然後,如果為空指針,就使用malloc配置設定(原來什麼都沒有),否則使用realloc配置設定。動态配置設定記憶體,可以節約記憶體空間。最後,把push的數值放入棧頂。

pop的操作也很簡單。

pop操作需要對nData做特判,大小為零則直接退出,不然在配置設定時會出錯。

如果nData=0,那麼realloc的參數為0,相當于使用free(Data)。

傳回棧頂元素Data[nData-1]。