//堆栈的链式
#include<stdio.h>
#include<malloc.h>
typedef int DataType;
typedef struct Sstack
{ DataType data;
struct Sstack *next;
}Lstack;
//初始化
void StackInit(Lstack **s)
{
*s=(Lstack*)malloc(sizeof(Lstack)); //他就是传进来的那个指针变量,来存放申请的地址
(*s)->next=NULL; //申请了一个头结点,也就是申请的那个地址
}
//判断是否为空
int StackNe(Lstack *s,DataType x)
{
//判断堆栈是否为空
if(s->next==NULL)
{
printf("这个栈为空!");
return 0;
}
else
{
printf("这个栈不为空");
}
}
//入栈
int StackInsert(Lstack *s, DataType x)
{
// 在添加元素的时候要动态的申请节点添加到头结点之后
Lstack *p;
p=(Lstack*)malloc(sizeof(Lstack));
p->data=x;
p->next=s->next; //这两个就说明了头指针是在栈顶,而且每次添加的节点都在
s->next=p; //头指针之后再前一个节点之前,也就是最后插入的在栈顶。
return 1;
}
//出栈
int StackOut(Lstack *s,DataType *x)
{
Lstack *p;
p=s->next;
if(p==NULL)
{
printf("栈为空");
return 0;
}
else
{
s->next=p->next;
*x=p->data;
free(p);
return 1;
}
}
//取出栈顶元素
int StackTop(Lstack *s,DataType *x)
{
Lstack *p;
p= s->next;
if(p==NULL)
{
printf("堆栈为空");
return 0;
}
else
{
*x=p->data;
return 1;
}
}
//释放申请空间
void StackDestroy(Lstack *s)
{
Lstack *p,*q;
p=s;
while(p!=NULL)
{
q=p;
p=p->next;
free(q) ;
}
}
//主函数
int main()
{
int i, x;
Lstack *mystack;
//初始化
StackInit(&mystack);
//入栈
for(i=0;i<10;i++)
StackInsert(mystack,i+1) ;
//出栈
for (i=0;i<10;i++)
{
StackOut(mystack,&x);
printf("%d \t",x);
}
return 0;
}