#include <stdio.h>
#include <stdlib.h>
typedef struct StackNode{
int data;
struct StackNode *next;
}T_StackNode,*PT_StackNode;
typedef struct LinkStack{
PT_StackNode top;
int count;
}P_LinkStack,*PT_LinkStack;
int InitStack(PT_LinkStack *S)
{
*S = (PT_LinkStack)malloc(sizeof(struct LinkStack));
(*S)->top = NULL;
(*S)->count = 0;
return 1;
}
int ClearStack(PT_LinkStack s)
{
PT_StackNode p;
while(s->top)
{
p = s->top;
s->top = s->top->next;
s->count--;
free(p);
}
return 1;
}
int DestroyStack(PT_LinkStack S)
{
ClearStack(S);
free(S);
return 1;
}
int StackEmpty(PT_LinkStack S)
{
if(S->top)/*栈存在且非空*/
return 0;
else
return 1;
}
int GetTop(PT_LinkStack S,int *e)
{
if(!S->top)return 0;
*e = S->top->data;
return 1;
}
int Push(PT_LinkStack S,int e)
{
//printf(" push begin");
PT_StackNode p = (PT_StackNode)malloc(sizeof(struct StackNode));
p->data = e;
p->next = S->top;
S->top = p;
S->count++;
//printf(" push ok");
return 1;
}
int Pop(PT_LinkStack S,int *e)
{
PT_StackNode p;
if (!GetTop(S,e))
return 0;
p = S->top;
S->top = S->top->next;
S->count--;
free(p);
return 1;
}
int StackLength(PT_LinkStack S)
{
return S->count;
}
int StackTraverse(PT_LinkStack S,int (* visit)(int))
{
PT_StackNode p;
p = S->top;
while(p){
visit(p->data);
p = p->next;
}
printf("\n");
return 1;
}
int visit(int e)
{
printf("%d ",e);
return 1;
}
int main(void)
{
int e,i;
PT_LinkStack s;
printf("InitStack初始化栈并将1--12压入栈\n");
if(InitStack(&s))
for(e = 1; e <= 12; e++)
{
Push(s,e);
}
printf("StackTraverse栈中元素从栈顶依次为:\n");
StackTraverse(s,visit);
Pop(s,&e);
printf("Pop弹出的元素为:%d\n",e);
Pop(s,&e);
printf("Pop又弹出的元素为:%d\n",e);
printf("Push将刚刚弹出的元素%d再次压入\n",e);
Push(s,e);
printf("StackEmpty判断栈是否为空:%d(1:是 0:不是)\n",StackEmpty(s));
GetTop(s,&e);
printf("GetTop当前栈顶元素为:%d\n",e);
printf("StackLength:当前栈长度为%d \n",StackLength(s));
ClearStack(s);
printf("ClearStack栈清空后,StackEmpty栈是否为空%d(1:是 0:不是)\n",StackEmpty(s));
DestroyStack(s);
printf("DestroyStack栈销毁");
return 0;
}
数据结构之链栈
最新推荐文章于 2022-01-10 02:02:28 发布