一:链式栈
1)逻辑结构:线性结构
2)存储结构:链式存储
3)操作:入栈、出栈
二:头文件定义
#ifndef _LINKSTACK_H_
#define _LINKSTACK_H_
#include <stdio.h>
#include <stdlib.h>
//入栈和出栈只在第一个节点位置操作
typedef int datatype;
typedef struct linkstack
{
datatype data;//数据域
struct linkstack *next;//指针域
}linkstack_t;
//1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop);
//2.入栈 data是入栈的数据
/*参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
那么修改main函数中的top,我们采用地址传递*/
int PushLinkStack(linkstack_t **ptop, datatype data);
//3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top);
//4.出栈
datatype PopLinkStack(linkstack_t **ptop);
//5.清空栈
void ClearLinkStack(linkstack_t **ptop);//用二级指针,是因为清空后需要将main函数中的top变为NULL
//6.求栈的长度
int LengthLinkStack(linkstack_t *top);//用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top);
#endif
三:代码实现
#include"linkstack.h"
//1.创建一个空的栈
void CreateEpLinkStack(linkstack_t **ptop)
{
*ptop=NULL;
}
//2.入栈 data是入栈的数据
/*参数上之所以采用二级指针,因为我们要随着入栈添加新的节点作为头,top需要永远指向当前链表的头,
那么修改main函数中的top,我们采用地址传递*/
int PushLinkStack(linkstack_t **ptop, datatype data)
{
//
linkstack_t *pnew=(linkstack_t *)malloc(sizeof(linkstack_t));
if(pnew==NULL)
{
perror("CreateEpLinkStack err") ;
return -1;
}
//初始化
pnew->data=data;
pnew->next=NULL;
//将新节点插入
pnew->next=*ptop;
//移动栈针,栈针top永远指向无头单向链表的第一个节点
*ptop=pnew;
return 0;
}
//3.判断栈是否为空
int IsEpLinkStack(linkstack_t *top)
{
return top==NULL;
}
//4.出栈
datatype PopLinkStack(linkstack_t **ptop)
{
//容错判断
if(IsEpLinkStack(*ptop))
{
perror("栈空");
return -1;
}
//定义pdel指向被删除节点
linkstack_t *pdel=*ptop;
//定义一个变量保存出站数据
int temp=pdel->data;
//int temp=(*ptop)->data;
//移动栈针
*ptop=pdel->next;
free(pdel);
pdel=NULL;
//返回值
return temp;
}
//5.清空栈
void ClearLinkStack(linkstack_t **ptop)//用二级指针,是因为清空后需要将main函数中的top变为NULL
{
while(*ptop!=NULL)
{
PopLinkStack(ptop);
}
}
//6.求栈的长度
int LengthLinkStack(linkstack_t *top)//用一级指针,是因为我只是求长度,不需要修改main函数中top指针的指向
{
int sum=0;
while(top!=NULL)
{
top=top->next;
sum++;
}
return sum;
}
//7.获取栈顶数据,不是出栈,不需要移动main函数中的top,所以用一级指针
datatype GetTopLinkStack(linkstack_t *top)
{
if(!IsEpLinkStack(top))
return top->data;
return -1;
}