①基本定義
採用鏈式存儲結構的棧稱爲鏈棧,和順序棧相比,鏈棧的優點是不存在棧滿上溢出的情況,有關順序棧的內容可以點此查看。
②存儲方式與結構
棧(a1,a2,...,an-1,an)
↓映射
③實現
順序棧棧空的條件是s->top==-1,而鏈棧棧空的條件則是s->next=NULL。
#include <iostream>
#include <cstdio>
#define MaxSize 50
typedef int ElemType;
typedef struct linknode
{
ElemType data; //數據域
linknode *next; //指針域
}LinkStNode; //鏈域結點類型
/*****初始化棧*****/
void InitStack(LinkStNode * &s)
{
s=(LinkStNode *)malloc(sizeof(LinkStNode));
s->next==NULL;
}
/*****銷燬棧*****/
void DestroyStack(LinkStNode * &s)
{
LinkStNode *pre=s,*p=s->next; //pre指向頭結點,p指向首結點
while(p!=NULL) //循環到p爲空爲止
{
free(pre);
pre=p; //pre,p同步後移
p=pre->next;
}
free(pre); //此時pre指向尾結點,釋放其空間
}
/*****判斷棧是否爲空棧*****/
bool StackEmpty(LinkStNode *s)
{
return (s->next==NULL);
}
/*****進棧*****/
void Push(LinkStNode * &s,ElemType e)
{
LinkStNode *p;
p=(LinkStNode *)malloc(sizeof(LinkStNode));
p->data=e;
p->next=s->next; //將p結點插入作爲首結點
s->next=p;
}
/*****出棧*****/
bool Pop(LinkStNode * &s,ElemType &e)
{
LinkStNode *p;
if(s->next==NULL) //棧空的情況
return false;
p=s->next; //p指向首結點
e=p->data; //提取首結點值
s->next=p->next; //刪除首結點
free(p);
return true;
}
/*****取棧頂元素*****/
bool GetTop(LinkStNode *s,ElemType &e)
{
if(s->next==NULL) //棧空的情況
return false;
e=s->next->data; //提取首結點值
return true;
}
int main()
{
return 0;
}
---代碼和部分內容參考自《數據結構教程》