鏈棧
個人認爲,簡單形容棧就是隻有一個頭能進出。first in last out相信不是很難理解的問題,在這裏主要講一講鏈棧。
首先鏈棧同樣是棧,當然也是filo的。
鏈棧是指採用鏈接存儲的結構實現的棧。事實上鍊棧和鏈表的樣子很像。
其中data爲數據,next爲下一個數據的指針
class LinkStack { datatype data; LinkStack *next; }
LinkStack就是就是這樣的數據類型。LinkStack t,*S=&t;。然後使用S->data描述該點元素的值,S->next來描述該節點邏輯後繼值的存儲地址。
由於鏈棧不存在棧滿的情況,所以不需要像正常的順序棧一樣判斷是否棧滿。對鏈棧的操作同樣有以下幾類:置空棧,判空棧,判滿棧,取棧頂元素,入棧,出棧。
鏈棧置空算法
LinkStack * SetStack() { LinkStack *LS; LS=NULL; return LS; }
鏈棧判斷空算法
int StackEmpty(LinkStack *LS)//空時返回1,不空返回0 { if(LS==NULL) return 1; else return 0; }
鏈棧取頂算法
datatype GetTop(LinkStack *LS) { if(LS!=NULL) return LS->data; else cout<<"棧空"; }
鏈棧入棧算法
在棧頂插入值爲x的元素存放在一個新創建的LinkStack的data中。原本的LS與新創建的LinkStack的next相等。然後LS與原來的首元素斷開,與x連接。如圖:
LinkStack *Push(LinkStack *LS,datatype x) { LinkStack *p; p=(LinkStack *)malloc(sizeof(LinkStack)) p->data=x; p->next=LS; LS=p; return LS; }
鏈棧出棧算法
首先將創建一個新的LinkStack *pop,不需要分配內存空間。直接將pop指向出棧data,LS指向pop的next空間。然後斷開LS原本指向pop中data。
LinkStack *POP(LinkStack *LS) { LinkStack *poptem; poptem=LS; LS=poptem->next; free(poptem); return LS; }