//栈的初始化,进栈,出栈,遍历栈,清空栈
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node
{
int data;
Node *next;
}*pNode;
typedef struct Stack
{
pNode ptop;
pNode pBottom;
}STACK,*pStack;
//-------------------------
//栈的初始化(指针都要初始化)
void init(pStack ps)
{
ps->ptop=(pNode)malloc(sizeof(Node));
if(ps->ptop== NULL)
{
printf("初始化失败\n");
exit(-1);
}
else
{
ps->pBottom=ps->ptop; //当插入多组数据时,是往上堆栈,所以将ptop作为结束地址
ps->ptop->next=NULL;
}
}
//插入元素到栈顶
void push(pStack ps,int value)
{
pNode pNew = (pNode)malloc(sizeof(Node));
pNew->data=value;
pNew->next=ps->ptop; //链接下个栈的链
ps->ptop=pNew;
}
//遍历栈 即将栈都输出一遍
void travel(pStack ps)
{
pNode s=ps->ptop;
printf("所有元素为:");
while (s!=ps->pBottom)
{
printf("%d\t",s->data);
s=s->next;
}
printf("\n");
}
//判断栈是否为空栈
int empty(pStack ps)
{
if (ps->pBottom == ps->ptop)
{
printf("空栈");
return 1;
}
else
return 0;
}
//所谓出栈即将删除栈顶的数据
bool pop(pStack ps,int *val)
{
if (empty(ps))
{
return false;
}
else
{
pNode p=ps->ptop;
*val = ps->ptop->data;
ps->ptop=ps->ptop->next;
free(p); //指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。
p=NULL; //别看free和delete的名字恶狠狠的(尤其是delete),它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉
return true;
}
}
//清空栈
void clear(pStack ps)
{
pNode p=ps->ptop;
pNode q=NULL;
while (p != ps->pBottom)
{
q=p->next;
free(p);
p = q;
}
ps->ptop=ps->pBottom;
}
int main()
{
//pStack ps=NULL;//出错
int val;//int *val; 一开始这样写,太蠢了
STACK ps;
init(&ps);
push(&ps,1);
push(&ps,2);
push(&ps,3);
push(&ps,4);
push(&ps,5);
push(&ps,6);
travel(&ps);
if(pop(&ps,&val))
{
printf("遍历成功出栈元素为: %d\n",val);
}
else
{
printf("遍历失败\n");
}
travel(&ps);
clear(&ps);
printf("清空栈后");
travel(&ps);
return 0;
}