上一篇博客我们进行了栈的顺序存储结构的简单实现,这一篇博客进行栈的链式存储结构的简单实现
一、链栈的定义
我们都知道栈有栈顶指针,链表有头指针,这两者是缺一不可的,所以在进行链栈的设计的时候,我们就把栈顶放在单链表的头部。从而方便我们的插入和删除的操作。那么链栈的基本结构如下所示:
二、链栈的简单实现
1、链栈的整体结构的定义
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node* next;
}Node,stack,*pstack;
2、初始化(init)
void init(pstack pst)
{
if(pst != NULL)
{
pst->next = NULL;
}
}
3、压栈(push)
因为链栈不存在栈满的情况,除非是我们的内存不够使用了。所以我们不需要写判满函数。但是由于我们要插入一个结点,所以我们就需要生成一个新的结点,所以我们就需要写购买结点的函数。
Node* buyNode(ElemType val)
{
Node* pnewnode = (Node*)malloc(sizeof(Node));
pnewnode->data = val;
pnewnode->next = NULL;
}
插入元素的操作如下图所示:
代码实现
void push(pstack pst,ElemType val)//元素做一个链表的头插
{
Node* pnewnode = buyNode(val);
pnewnode->next = pst->next;
pst->next = pnewnode;
}
4、出栈(pop)
在进行出栈操作之前我们需要对链栈进行判空的操作,如果栈里面没有元素,就不能进行删除元素的操作。
int empty(pstack pst)
{
return pst->next == NULL ? 1 : 0;
}
删除元素的操作如下图所示:
代码实现:
int pop(pstack pst)
{
if(empty(pst))
{
return 0;
}
Node* pcur = pst->next;//第一个数据结点
pst->next = pcur->next;
free(pcur);
return 1;
}
5、获取栈顶元素(gettop)
int gettop(patsck pst,ElemType* prt)
{
if(empty(pst))
{
return 0;
}
*prt = pst->next->data;//第一个数据结点的数据
return 1;
}
6、销毁函数(destory)
因为链栈所以我们最后得设计摧毁函数
void destory(pstack pst)
{
Node* pcur = pst->next;
Node* pnext = NULL;
while(pcur !=NULL)
{
pnext = pcur->next;
free(pcur);
pcur = pnext;
}
pst->next = NULL;
}