親自教你實現(xiàn)棧及C#中Stack源碼分析_第1頁
親自教你實現(xiàn)棧及C#中Stack源碼分析_第2頁
親自教你實現(xiàn)棧及C#中Stack源碼分析_第3頁
親自教你實現(xiàn)棧及C#中Stack源碼分析_第4頁
親自教你實現(xiàn)棧及C#中Stack源碼分析_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

第親自教你實現(xiàn)棧及C#中Stack源碼分析棧又名堆棧,是一種操作受限的線性表,僅能在表尾進行插入和刪除操作。

它的特點是先進后出,就好比我們往桶里面放盤子,放的時候都是從下往上一個一個放(入棧),取的時候只能從上往下一個一個?。ǔ鰲#?,這個比喻并非十分恰當,比如拿盤子的時候只是習慣從上面開始拿,也可以從中間拿,而棧的話是只能操作最上面的元素,這樣比喻只是為了便于了解。

剛開始接觸??赡軙行┮蓡枺覀円呀?jīng)有數(shù)組和鏈表了,為什么還要棧這個操作受限制的數(shù)據(jù)結構呢?數(shù)組和鏈表雖然靈活,但是操作起來也更容易出錯,而棧因為操作受限,在特定場景中使用還是有優(yōu)勢的。

當某個數(shù)據(jù)集合只涉及在一端插入和刪除數(shù)據(jù),并且滿足先進后出的特性時,我們就應該首選“?!边@種數(shù)據(jù)結構。

棧的實現(xiàn)方式有兩種,一種是基于數(shù)組實現(xiàn)的順序棧,另一種是基于鏈表實現(xiàn)的鏈式棧。它的主要操作也就兩個,即入棧和出棧,難度并不大。

先了解一下入棧(Push)和出棧(Pop),如下圖

基于數(shù)組實現(xiàn),就面臨著數(shù)組大小固定、擴容成本大的問題,下面是使用C#實現(xiàn)出棧和入棧簡單功能代碼。

//基于數(shù)組實現(xiàn)的順序棧

publicclassArrayStack

privatestring[]items;//數(shù)組

privateintcount;//棧中元素個數(shù)

privateintn;//棧的大小

//初始化數(shù)組,申請一個大小為n的數(shù)組空間

publicArrayStack(intn)

this.items=newstring[n];

this.n=n;

this.count=0;

//入棧操作

publicboolPush(stringitem)

//數(shù)組空間不夠了,直接返回false,入棧失敗。

if(count==n)returnfalse;

//將item放到下標為count的位置,并且count加一

items[count]=item;

++count;

returntrue;

//出棧操作

publicstringPop()

//棧為空,則直接返回null

if(count==0)returnnull;

//返回下標為count-1的數(shù)組元素,并且棧中元素個數(shù)count減一

stringtmp=items[count-1];

--count;

returntmp;

}

上面代碼有一些很明顯的缺點,比如存儲的數(shù)據(jù)類型固定為string(C#中使用泛型可以很好的解決),大小固定...這只是簡單的功能演示,后面分析C#中Stack源碼時這些問題都會被化解。

出棧和入棧的時間復雜度是多少呢?這個很好計算,因為出棧和入棧都只涉及棧頂?shù)脑?,所以是O(1)。

空間復雜度呢?還是O(1),因為這里只額外使用了count和n兩個臨時變量。

♂空間復雜度是指除了原本的數(shù)據(jù)存儲空間外,算法運行還需要額外的存儲空間。例子中大小為n的數(shù)組是無法省略的,也就是說這n個空間是必須的,對復雜度不了解的可以點擊查看一文搞定算法復雜度分析。

話不多說,上代碼

//鏈表實現(xiàn)棧

publicclassLinkStackT

//棧頂指示器

publicNodeTTop{get;set;}

//棧中結點的個數(shù)

publicintNCount{get;set;}

//初始化

publicLinkStack()

Top=null;

NCount=0;

//獲取棧的長度

publicintGetLength()

returnNCount;

//判斷棧是否為空

publicboolIsEmpty()

if((Top==null)(0==NCount))

returntrue;

returnfalse;

//入棧

publicvoidPush(Titem)

NodeTp=newNodeT(item);

if(Top==null)

Top=p;

else

p.Next=Top;

Top=p;

NCount++;

//出棧

publicTPop()

if(IsEmpty())

returndefault(T);

NodeTp=Top;

Top=Top.Next;

--NCount;

returnp.Data;

//結點定義

publicclassNodeT

publicTData;

publicNodeTNext;

publicNode(Titem)

Data=item;

}

時間復雜度和空間復雜度均為O(1).

C#中Stack源碼分析

前面我們已經(jīng)知道了順序棧和鏈式棧的優(yōu)缺點,那么C#語言中自帶的Stack是基于什么實現(xiàn)的呢?

答案是順序棧。Stack是一個泛型類,里面定義了一個泛型數(shù)組用以存儲數(shù)據(jù)

privateT[]_array;

既然是一個順序棧,為什么在使用的過程中什么不需要初始化數(shù)組大小,也不用擔心擴容問題呢?

當我們實例化Stack的時候,會調(diào)用它的構造函數(shù),初始化數(shù)組大小為0.

publicStack()

_array=_emptyArray;

_size=0;

_version=0;

}

向數(shù)組中添加元素時,會檢測數(shù)組是否還有空閑容量,如果超出數(shù)組大小,將進行擴容

publicvoidPush(Titem)

if(_size==_array.Length)

T[]array=newT[(_array.Length==0)4:(2*_array.Length)];

Array.Copy(_array,0,array,0,_size);

_array=array;

_array[_size++]=item;

_version++;

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論