#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int DataType;
typedef struct SNode
{
DataType data;
struct SNode * next;
}*LinkStack;
bool Init_Stack(LinkStack * Top); // 栈初始化(不带头结点)
bool Push_Stack(LinkStack * Top, DataType x); // 入栈
bool Pop_Stack(LinkStack * Top, DataType * x); // 出栈
int GetTop_Stack(LinkStack Top); // 获取栈顶元素
bool Destroy_Stack(LinkStack * Top); // 销毁栈
bool Traverse_Stack(LinkStack Top); // 遍历栈
bool Empty_Stack(LinkStack Top); // 判栈空
int main()
{
DataType x;
LinkStack S;
if(Init_Stack(&S))
printf("链栈初始化成功!\n");
else
printf("链栈初始化失败!\n");
Push_Stack(&S,1);
Push_Stack(&S,4);
Push_Stack(&S,7);
Push_Stack(&S,2);
Push_Stack(&S,5);
Push_Stack(&S,8);
Push_Stack(&S,3);
Push_Stack(&S,6);
Push_Stack(&S,9);
printf("遍历链栈:");
Traverse_Stack(S);
printf("\n\n");
printf("栈顶元素:%d\n\n",GetTop_Stack(S));
if(Pop_Stack(&S, &x))
{
printf("出栈成功!\n");
printf("您出栈的元素:%d\n",x);
}
else
printf("出栈失败!\n");
printf("遍历链栈:");
Traverse_Stack(S);
printf("\n\n");
if(Destroy_Stack(&S))
printf("销毁成功!\n");
else
printf("销毁失败!\n");
printf("遍历链栈:");
Traverse_Stack(S);
return 0;
}
// 注意防止产生空指针
bool Init_Stack(LinkStack * Top)
{
*Top = NULL; // 空栈时,栈顶指针指向空
return true;
}
// 注意防止产生空指针
bool Push_Stack(LinkStack * Top, DataType x)
{
printf("入栈元素:%d\n",x);
LinkStack p = (LinkStack)malloc(sizeof(struct SNode));
if(!p)
{
printf("申请空间失败!\n");
exit(-1);
}
p->data = x;
p->next = *Top;
*Top = p;
return true;
}
// 注意防止产生空指针
bool Pop_Stack(LinkStack * Top, DataType * x)
{
if(Empty_Stack(*Top))
return false;
LinkStack p = *Top;
*x = p->data;
*Top = p->next;
free(p);
p = NULL;
return true;
}
int GetTop_Stack(LinkStack Top)
{
if(Empty_Stack(Top))
return false;
return Top->data;
}
// 注意防止产生空指针
bool Destroy_Stack(LinkStack * Top)
{
LinkStack p = *Top;
while(*Top)
{
p = p->next;
free(*Top);
*Top = p;
}
return true;
}
bool Traverse_Stack(LinkStack Top)
{
LinkStack p = Top;
while(p)
{
printf("%3d",p->data);
p = p->next;
}
return true;
}
bool Empty_Stack(LinkStack Top)
{
if(Top==NULL)
return true;
else
return false;
}
