1.栈的结构体定义
typedef struct Linknode
{
ElemTyp data; //数据域
struct Linknode* next; //指针域
}*LiStack;
2.栈的初始化
int initStack(LinkStack* S)
{
S=NULL; //头指针指向空
return 0;
}
3.入栈
void Push(LinkStack* s,ElemType e)
{
LiStack p;
p=malloc(sizeof(StackNode));//为插入的结点p申请内存空间
p->data=e; //将数据e赋给结点p的数据域
p->next=s; //让s作为p的后继
s=p; //s重新指向p,即栈顶
}
4.出栈
int Pop(LinkStack* S,ElemType* e)
{
LiStack p;//创造删除工具变量
if(S==NULL)//判栈空
return 1;
else
{
*e=S->data; //将栈顶元素指针S的值赋给e返回
p=S; //让p指向S,准备释放元素结点
S=S->next; //S指向栈顶的下一个结点
free(p); //释放p
}
return 0;
}
总结
1.链栈类似于一种操作受限的单链表,单链表可以在任何位置存储,而链栈只能在栈顶进行入栈或出栈操作,类似于一个只能进行头插法\尾插法的单链表。
2.链栈没有头结点,其栈顶指针直接指向数据元素。