#i
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef int DataType ;
//栈节点类型
typedef struct Node
{
DataType data;
struct Node *next;
} Node,*pNode;
//栈类型
typedef struct LinkStack
{
pNode top;
int stacksize;
} LinkStack,*pLinkStack;
pLinkStack InitLinkStack();
void ClearLinkStack(pLinkStack s);
void DestroyLinkStack(pLinkStack s);
void Push(pLinkStack s,DataType x);
void Pop(pLinkStack s,DataType *x);
int GetLinkStackSize(pLinkStack s);
DataType GetTop(pLinkStack s );
int IsLinkStackEmpty(pLinkStack s);
void LinkStackTraverse(pLinkStack s, void (*Visit)(DataType data) );
void print(DataType data);
pLinkStack InitLinkStack()
{
pLinkStack s=(pLinkStack) malloc(sizeof( LinkStack)) ;
if(!s)
{
s->stacksize=0;
s->top=NULL;
}
return s;
}
void ClearLinkStack(pLinkStack s)
{
DataType data;
while( s->stacksize )
{
Pop(s,&data);
}
}
void DestroyLinkStack(pLinkStack s)
{
if( s->stacksize)
ClearLinkStack(s);
free(s);
}
void Push(pLinkStack s,DataType x)
{
pNode p=(pNode ) malloc( sizeof(Node)) ;
if( !p )
exit(-1);
p->data=x;
p->next=NULL;
p->next=s->top ;
s->top=p;
s->stacksize++;
}
void Pop(pLinkStack s,DataType *x)
{
if(s->stacksize==0)
{
printf("the linkstack is null.can't pop anything\n");
*x='\0';
}
else
{
pNode p=s->top;
*x=p->data;
s->top=s->top->next;
s->stacksize--;
free(p);
}
}
int GetLinkStackSize(pLinkStack s)
{
return s->stacksize;
}
DataType GetTop(pLinkStack s )
{
if(s->stacksize==0)
{
printf("the linkstack is null");
return 0;
}
else
{
return s->top->data;
}
}
int IsLinkStackEmpty(pLinkStack s)
{
if(s->stacksize==0)
return 1;
else
return 0;
}
void LinkStackTraverse(pLinkStack s, void (*Visit)(DataType data) )
{
pNode p=s->top;
while(p)
{
Visit(p->data) ;
p=p->next;
}
}
void print(DataType data)
{
printf("%d ",data);
}
int main()
{
pLinkStack s=InitLinkStack();
int i;
printf("gettop :\n");
for( i=0 ;i<100;i++)
{
Push(s,i);
DataType datatop= GetTop(s);
printf("%d ",datatop);
}
printf("\nIsLinkStackEmpty %d",IsLinkStackEmpty(s) );
printf("\n traverse the LinkStack:\n");
LinkStackTraverse(s ,print);
printf("\n the current LinkStack' size :%d\n",GetLinkStackSize(s) );
DataType data;
Pop(s,&data);
printf("Pop %d \n",data);
printf("\n the current LinkStack' size :%d\n",GetLinkStackSize(s) );
Pop(s,&data);
printf("Pop %d \n",data);
printf("LinkStack clear!\n");
ClearLinkStack(s);
printf("LinkStack destroy!\n");
DestroyLinkStack(s);
}