栈的链式储存结构的c语言实现
链栈的基本定义
采用链式存储结构实现的栈称为链栈,链栈通常采用单链表来实现,因此其结构与单链表的结构相似,由于栈的插入和删除操作仅限制在栈顶位置进行,所以采用单链表的表头指针作为栈顶指针。链栈是一种特殊的线性链表,和所有链表一样,是动态存储结构,无需预先分配存储空间。
链栈的基本操作
结构体的定义
typedef struct StackNode
{
elemtype data;
struct StackNode *next;
}StackNode;
typedef struct LinkStack
{
StackNode *top;
int count;
}LinkStack;
链栈的初始化
void Init_LinkStack(LinkStack *L) //链栈的初始化
{
L->count = 0;
L->top = NULL; //链栈不需要头节点,L->top = NULL 即代表空栈
}
链栈不需要头节点,所以链栈为空就是top = NULL
栈的入栈函数
int Push(LinkStack *L, elemtype e) //链栈的入栈操作
{
StackNode *s;
s = (StackNode *)malloc(sizeof(StackNode)); //为新加入的元素分配空间
s->data = e; //将新加入的元素e赋值给s->data
s->next = L->top; //将原先的第一个节点赋值给新加入节点的next
L->top = s; //将新节点赋值给top指针
L->count++; //元素数量加一
return 0;
}
栈的出栈函数
nt Pop(LinkStack *L, elemtype *e) //链栈的出栈操作
{
if (L->count == 0)
{
printf("当前链栈为空!"); //如果没有元素,返回
return 0;
}
StackNode *s; //新创建一个节点指针
s = L->top; //将要删除的栈顶节点赋值给s
L->top = s->next; //将要删除栈顶节点的下一个节点赋值给top
*e = s->data;
free(s); //释放要删除的节点s
L->count--; //元素数量减一
return 0;
}
返回栈的长度
int Length_LinkStack(LinkStack *L) //返回链栈的长度
{
return L->count;
}
得到栈顶元素
void Get_LinkStack(LinkStack *L,elemtype *e) //得到链栈的栈顶元素
{
*e = L->top->data;
printf("栈顶元素为:%d\n", *e);
}
打印出该链栈
int Show_LinkStack(LinkStack *L) //打印出链栈所有元素
{
StackNode *s;
s = L->top; //将栈顶指针先赋值给s指针,保存起来
if (L->count == 0)
{
printf("栈为空!\n");
return 0;
}
while (L->top != NULL) //循环,依次打印出栈内元素
{
printf("栈元素为:");
printf("%d\n", L->top->data);
L->top = L->top->next;
}
L->top = s; //将栈顶指针还原
return 0;
}
注意此函数当栈顶指针top循环后一定要在最后使它回到栈顶位置
到此,链栈的基本操作函数就已经完成了,下面附上源码
源码:
#include<stdio.h>
#include<stdlib.h>
typedef int elemtype;
typedef struct StackNode
{
elemtype data;
struct StackNode *next;
}StackNode;
typedef struct LinkStack
{
StackNode *top;
int count;
}LinkStack;
void Init_LinkStack(LinkStack *L) //链栈的初始化
{
L->count = 0;
L->top = NULL; //链栈不需要头节点,L->top = NULL 即代表空栈
}
int Push(LinkStack *L, elemtype e) //链栈的入栈操作
{
StackNode *s;
s = (StackNode *)malloc(sizeof(StackNode)); //为新加入的元素分配空间
s->data = e; //将新加入的元素e赋值给s->data
s->next = L->top; //将原先的第一个节点赋值给新加入节点的next
L->top = s; //将新节点赋值给top指针
L->count++; //元素数量加一
return 0;
}
int Pop(LinkStack *L, elemtype *e) //链栈的出栈操作
{
if (L->count == 0)
{
printf("当前链栈为空!"); //如果没有元素,返回
return 0;
}
StackNode *s; //新创建一个节点指针
s = L->top; //将要删除的栈顶节点赋值给s
L->top = s->next; //将要删除栈顶节点的下一个节点赋值给top
*e = s->data;
free(s); //释放要删除的节点s
L->count--; //元素数量减一
return 0;
}
int Length_LinkStack(LinkStack *L) //返回链栈的长度
{
return L->count;
}
void Get_LinkStack(LinkStack *L,elemtype *e) //得到链栈的栈顶元素
{
*e = L->top->data;
printf("栈顶元素为:%d\n", *e);
}
int Show_LinkStack(LinkStack *L) //打印出链栈所有元素
{
StackNode *s;
s = L->top; //将栈顶指针先赋值给s指针,保存起来
if (L->count == 0)
{
printf("栈为空!\n");
return 0;
}
while (L->top != NULL) //循环,依次打印出栈内元素
{
printf("栈元素为:");
printf("%d\n", L->top->data);
L->top = L->top->next;
}
L->top = s; //将栈顶指针还原
return 0;
}
int main()
{
LinkStack L;
elemtype m;
Init_LinkStack(&L);
Push(&L, 5);
Push(&L, 4);
Push(&L, 43);
Push(&L, 23);
Push(&L, 98);
Show_LinkStack(&L);
printf("栈长度为%d\n", Length_LinkStack(&L));
Pop(&L, &m);
printf("出栈的元素为:%d\n", m);
Pop(&L, &m);
printf("出栈的元素为:%d\n", m);
Show_LinkStack(&L);
printf("栈长度为%d\n",Length_LinkStack(&L));
Get_LinkStack(&L, &m);
system("pause");
return 0;
}