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