①基本定义
采用链式存储结构的栈称为链栈,和顺序栈相比,链栈的优点是不存在栈满上溢出的情况,有关顺序栈的内容可以点此查看。
②存储方式与结构
栈(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;
}
---代码和部分内容参考自《数据结构教程》