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