前言
链式栈是一种将链表和栈结合的数据结构,他有着栈的优点,也同时有着链表大小没有限制的优点,它里面的数据是由一个个节点所构成的
链式栈的数据结构
它是由是一个链表和一个栈组成,如图所示
typedef struct link_
{
int data;
struct link_ *next;
}link;
typedef struct lstack_
{
link *head;
int top;
}lstack;
链式栈的创建
lstack * lstack_create ()
{
lstack *s =(lstack *) malloc (sizeof (lstack)); //堆空间申请
if (wall (s)==-1)
return NULL;
s ->head =NULL;
s ->top =0;
return s;
}
链式栈的入栈
int lstack_push (lstack *s,int va)
{
if (wall (s)==-1)
return -1;
lstack *p =s;
if (wall (p) ==-1)
return -1;
link *new =(link *) malloc (sizeof (link)); //创建一个新节点
if (new ==NULL)
{
puts ("new NULL []");
return -1;
}
new ->data = va; //数值初始化
new ->next =p->head; //将新节点指向一开始的节点
p ->head=new; 将老节点的指针给新节点
s ->top++;
return 0;
}
链式栈的出栈
int lstack_pop (lstack *s,int *va)
{
if (wall (s)==-1)
return -1;
link *p =s ->head;
if (wall2 (p) ==-1)
return -1;
*va =p ->data;
s ->head = p->next; 指针向前移动
free (p); //释放第一个空间
p =NULL; //指针指空
s->top --;
return 0;
}
链式栈的查看
int lstack_show (lstack *s,int *va)
{
if (wall (s)==-1)
return -1;
lstack *p =s ;
if (wall (s) ==-1)
return -1;
*va=p ->head->data;
}
链式栈的释放
void lsatck_free (lstack *s)
{
int a=0;
while (s ->top !=0)
{
lstack_pop (s,&a); //出栈将栈出空
}
free (s); //释放栈
}