《資料結構和演算法》之棧的鏈式儲存結構
阿新 • • 發佈:2019-01-27
在上篇博文中我已經將棧的順序儲存結構簡單地介紹了一下,也舉了一個進位制轉換的例子,供大家學習參考。這裡將繼續進行棧的有關介紹,本篇博文重點對棧的鏈式儲存結構進行分析。
一,棧的鏈式儲存結構
棧的鏈式儲存結構簡稱棧鏈。棧因為只是棧頂來做插入和刪除操作,所以比較好的方法就是將棧頂放在單鏈表的頭部,棧頂指標和單鏈表的頭指標合二為一。
圖1 棧的鏈式結構示意圖
在圖1中可以看到,這是一個棧鏈,棧頂就相當於單鏈表的表頭,棧底就相當於單鏈表的表尾。
二,棧鏈的定義結構
typedef struct StackNode
{
ElemType data; //存放棧的資料
struct StackNode *next;
}StackNode, *LinkStackPtr;
typedef struct LinkStack
{
LinkStackPrt top; //指標
int count; //棧元素計算器
}
三,棧的具體操作
1,進棧操作
對於棧鏈的Push操作,假設元素的值為e的新結點是s, top為棧頂指標,我們得到如下程式碼:
Satus Push(LinkStack *s,ElemType e)
{
LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode));
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return OK;
}
2,出棧操作
鏈棧的出棧Pop操作,也是假設變數p用來儲存要刪除的棧頂結點,將棧頂指標下移一位,最後釋放p即可。
Satus Push(LinkStack *s,ElemType e) { LinkStackPtr p; if(StackEmpty(*s)) return ERROR; *e = s->top->data; p = s->top; s->top = s->top->next; free(p); s->count--; return OK; }