C語言鏈棧實現

2021-08-22 06:15:44 字數 1877 閱讀 6190

和順序棧不同的是,鏈棧使用鍊錶去儲存棧元素,由於鍊錶中的元素位址不連續,所以無需事先知道棧的最大儲存容量,需要的時候動態開闢就是了。因此,鏈棧中,維護棧結構就只有棧底和棧頂兩個指標。鏈棧的基本操作實際都是鍊錶的插入、刪除、遍歷操作,實現起來較容易。具體功能如下:

#include#include#include//鏈棧實現

//定義鏈棧儲存元素的資料結構

typedef struct lnodelnode, *plnode;

//定義維護鏈棧的資料結構

typedef struct lstacklstack;

/**鏈棧基本操作

初始化乙個空棧

入棧出棧

出棧並移除棧頂元素

判斷棧是否為空

返回棧的長度

將乙個棧置為空棧

銷毀乙個棧

*///初始化乙個空棧

bool initstack(lstack &s)//申請開闢記憶體失敗,退出

s.base->next = null;

s.top = s.base;

return true;

}//入棧

bool push(lstack &s, int e)//棧結構不存在

s.top->data = e;

plnode pnew = (plnode)malloc(sizeof(lnode));

if(pnew == null)

pnew->next = null;

s.top->next = pnew;

s.top = pnew;

return true;

}//出棧並用e返回

bool gettop(lstack &s,int &e)//空棧返回錯誤

plnode p = s.base;

while(p->next != s.top)

e = p->data;

return true;

}//移除棧頂元素並用e返回

bool pop(lstack &s,int &e)//空棧返回錯誤

plnode p = s.base;

while(p->next != s.top)

e = p->data;

plnode q = p->next;

p->next = null;

s.top = p;

free(q);

q = null;

return true;

}//判斷棧是否為空,為空返回true,非空返回false

bool isemptystack(lstack &s) //不存在的棧,異常退出

return s.top == s.base ? true : false;

}//將已存在的棧置為空棧

bool resetstack(lstack &s)

s.top = s.base;

plnode p = s.base->next;

s.base->next = null;

while(p != null)

return true;

}//返回當前棧的長度

int getstacklen(lstack &s)

plnode p = s.base;

int length = 0;

while(p != s.top)

return length;

}//銷毀棧

bool destroystack(lstack &s)

plnode p, q;

p = s.base;

while(p != null)

s.base = null;

return true;

}

C語言實現鏈棧

鏈棧顧名思義,採用鍊錶實現,其優點是不存在棧滿上溢位的情況,其操作都是在頭結點之後進行的,入棧類似與頭插法建立鍊錶。注意頭結點與棧頂節點的區別,在沒有元素入棧時,棧僅有初始化的乙個頭結點,判斷其是否為空只需判斷s next是否為null。下面用c語言 實現了鏈棧的基本操作 執行環境 vs2017 執...

C語言實現鏈棧

不多說,直接上 include include define max 100 define ok 1 define error 1 define stack size 100 typedef int elemtype 資料庫 elemtype data 5 elemtype number 鏈棧的節點...

c語言實現鏈棧

c語言 棧的鏈式表示與實現 採用順序儲存的棧也具有順序表類似的缺點 採用順序儲存的棧,即順序棧的儲存空間無法事先確定,如果棧空間分配過小,可能會造成溢位 如果棧空間分配過大,又容易造成儲存空間浪費,因此可以採用鏈式儲存結構表示棧 include includetypedef int elemtype...