棧的鏈式儲存結構實現(五)

2021-09-01 06:01:13 字數 1931 閱讀 1637

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 鏈棧的操作和普...

棧 鏈式儲存結構

講完了棧的順序儲存結構,現在來看棧的鏈式儲存結構,簡稱為鏈棧。想想看,棧只是棧頂來做插入和刪除操作,棧頂放在鍊錶的頭部還是尾部?由於單鏈表有頭指標,而棧頂指標也是必須的,所以比較好的辦法是把棧頂放在單鏈表的頭部。都已經有了棧頂在頭部了,單鏈表中常用的頭結點也就失去了意義,通常對於鏈棧來說,是不需要頭...