18.11.18
學習過之前的順序的棧了,這回介紹一下鏈式的棧
我們對棧進行操作時,通常都是在其棧頂進行,所以我們應該在鏈的頭部進行操作,我們之前學過的鍊錶大多是有頭結點的,頭結點可以大大方便我們對鍊錶的呼叫,現在,我們的這個鏈棧可以通過設定乙個棧頂指標top來代替頭結點,或者說起到頭結點的作用
鏈棧有些不同的是,我們需要定義兩個結構體,比之前稍增加了點難度,第乙個結構體,是用來定義鏈棧中的每乙個結點的(包括top結點)的結構,即stacknode,第二個結構體,是用來定義棧頂指標的,其包含top結點以及乙個計數器count,我們通常將第二個結構體命名為linkstack,因為當我們需要壓棧和出棧時,需要呼叫函式,呼叫函式時,需要傳入引數,一般都是傳入棧頂指標來對整個鏈棧進行操作的,所以直接把棧頂指標命名為linkstack(即鏈棧),就應該是它可以代表整個鏈棧了吧(個人理解)
typedef int selemtype;
//這裡將selemtype等同於int,實際運用中資料不一定是int的,可以改變
typedef struct stacknodestacknode,*pnode;//*pnode是結點的結構體指標
typedef struct linkstacklinkstack;
跟鍊錶很像,鍊錶是頭結點指向null,這裡是top結點指向null,同時將計數器置0
void initstack(linkstack *st)
現在是只有棧頂指標的空棧,我們要加入一下元素,就要壓棧
思路是創造乙個新的結點,將要加入的資料存入裡面,在將新結點壓入就行了,具體**如下
void insert(linkstack *st,selemtype e)
我們不僅要給函式傳入乙個棧頂指標位址,還要傳入乙個整型指標的位址來儲存彈出的元素,記得事後將彈出的結點free掉
int pop(linkstack *st,selemtype *e)
需要乙個定位指標,通過其遍歷整個鏈棧,列印遍歷到的每個結點的data域上的值
int print(linkstack *st)
printf("\n");
return 1;
}
將上述的函式合併起來進行除錯
#include#include#includetypedef int selemtype;
typedef struct stacknodestacknode,*pnode;//*pnode是結點的結構體指標
typedef struct linkstacklinkstack;
//函式宣告
void initstack(linkstack *st);
void insert(linkstack *st,selemtype e);
int pop(linkstack *st,selemtype *e);
int print(linkstack *st);
int main()
print(&st);
for(i=0;i<5;i++)
print(&st);
}void initstack(linkstack *st)
void insert(linkstack *st,selemtype e)
int pop(linkstack *st,selemtype *e)
int print(linkstack *st)
printf("\n");
return 1;
}
除錯結果
成功啦!!
棧的鏈式儲存結構及實現
今天學習棧的鏈式儲存結構。鏈式儲存結構最大的好處就是沒有空間的限制,通過指標指向將結點像乙個鍊子一樣把結點鏈結,那麼棧的同樣可以用於鏈式儲存結構。棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部呢?由於單鏈表有頭指標,而棧頂指標也是必須的,那麼幹嘛不讓他...
棧的鏈式儲存結構及實現
棧的鏈式儲存結構,簡稱為鏈棧,如圖所示 對於鏈棧來說,基本不存在棧滿的情況,除非記憶體以沒有儲存空間。鏈棧的結構 如下 typedef struct stacknode stacknode,linkstackptr typedef struct linkstack linkstack 鏈棧的操作和普...
棧 鏈式儲存結構
講完了棧的順序儲存結構,現在來看棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部?由於單鏈表有頭指標,而棧頂指標也是必須的,所以比較好的辦法是把棧頂放在單鏈表的頭部。都已經有了棧頂在頭部了,單鏈表中常用的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭...