栈详细定义请移步至 C语言 一分钟看懂的顺序存储栈表操作本文只讲解链表建栈以及操作
链式存储建栈的原理
我们都知道栈只能在一端进行操作,因此造成元素先进后出(First In Last Out),通常都是采用单链表的形式实现,并且规定所有的操作都在表头进行操作,因此我们才有头插法进行创建,建栈过程如图所示

链表建栈的有优点是便于多个栈共享存储空间,且不存在栈满上溢的情况
如果对你有帮助,点个赞呗
实现代码
结构体
typedef struct StckL
{
char data;
struct StckL* Next;
}StckL, *SL;
功能代码
初始化
SL InitStck(SL L)
{
/*
参数:链表首地址
函数功能:初始化链表
*/
L = (SL)malloc(sizeof(StckL));
if (L == NULL)
return NULL;//初始化失败
L->Next = NULL;
return L;//初始化成功
}
判空
在顺序表存储的时候我们可以利用栈顶指针S.top来判断栈是否为空,但是在在链表中这个想法是不现实的,但是我们可以利用链表的长度来判断栈是否为空
int StckEmpty(SL L)
{
/*
参数:栈表首地址
函数功能:利用链表长度来判断栈是否为空
*/
int i = -1;
while (L != NULL)
{
L = L->Next;
i++;//栈长度
}
return i;
}
出栈
SL Pop(SL L)
{
/*
参数:栈表首地址
函数功能:删除栈顶元素-----出栈
*/
SL s;//指向待删除的结点
if (StckEmpty(L) == 0)//表示栈为空
{
printf("栈为空,禁止操作\n");
return NULL;
}
s = L->Next;//保存出栈信息
L->Next = L->Next->Next;
return s;
}
压栈
SL Push(SL L)
{
/*
参数:栈表首地址
函数功能:元素利用头插法入栈----压栈
*/
SL s;
SL p;//新结点
char Ch;
s = L;
printf("请输入入栈的字符\n");
scanf_s("%c", &Ch);
getchar();
p = (SL)malloc(sizeof(StckL));//申请结点
p->data = Ch;
p->Next = s->Next;//头插法入栈
s->Next = p;
return L;
}
获取栈顶元素
因为我们只需要获得栈顶元素,所以我们不需要对链表进行修改
SL GetElement(StckL *L)
{
/*
参数:栈的首地址
函数功能:获得栈顶元素
*/
if (StckEmpty(L) == 0)
{
return NULL;//栈为空
}
return L->Next;//返回栈顶元素
}

2948

被折叠的 条评论
为什么被折叠?



