-
1 # 3rdlibs
-
2 # 南極影解
基本運算的程式碼實現
1. 結點型別的宣告typedef struct linknode{ ElemType data; struct linknode *next; }LinkStNode; //鏈棧的結點型別這樣定義之後,有幾個特性要注意咯
a)棧空的條件S.next=NULL
b)元素e的出棧操作:新建一個結點存放元素e,然後用一個指標p指向它,將結點p插入到頭結點之後
2. 初始化鏈棧InitStack(LinkStNode &s)void InitStack(LinkStNode &s){
s= (LinkStNode *)malloc(sizeof(LinkStNode));
s->next = NULL;
}
3. 進棧Push(LinkStStack&s,ElemType e)void Push(LinkStNode &s,ElemType e){LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
//新建結點
p->data = e;
p->next =s->next;
//將結點p插入到頭結點之後
s->next = p;
}
這個鏈式頭結點和前面的概念有點不一樣啊!!每次插入元素都放在頭結點之後,然後頭結點就是棧頂~
4. 出棧Pop(LinkStNode &s,ElemType &e)void Pop(LinkStNode &s,ElemType &e){
LinkStNode *p;
if(s->next == NULL)
return 0;
p = s->next;
e= p->data;
//提取資料
s->next = p->next;
free(p);
//釋放被刪結點的儲存空間
return 1;
}
5. 取棧頂元素getTop(LinkStNode &s,ElemType &e)void GetTop(LinkStNode &s,ElemType &e){
if(s->next == NULL)
return 0;
e = s->next->data;
return 1;
}
6. 判斷棧是否為空StackEmpty(LinkStNode *s)bool StackEmpty(LinkStNode *s){
return (s->next== NULL);
}
-
3 # 我是蛋卷
如果是C++,可以用模版來實現,更進一步,可能也不用自己寫,std庫中就有。
如果是C,有幾種做法,char是比int短的,可以申請一個union結構來存;還有一種做法是存一個萬能的void *吧,用的時候轉一下型。
我封裝一個鏈棧,開始可能這樣定義:
#define DataType int
但是我使用的時候需要兩個鏈棧,一個存int型別,另一個存char,這個該怎麼處理呢?
回覆列表
你可以使用c++模版來實現,模版鏈棧這樣定義:
template<typename DataType>
struct Node
{
DataType data;
Node<DataType>* next;
};
然後你把封裝的鏈棧實現類也改為模版就行了。