#include <stdio.h>
#include <stdbool.h>//bool的使用
#include <stdlib.h>
typedef struct node
{
int num;
struct node * next;
}NODE, *sNODE;
typedef struct stack
{
sNODE top;//应建立node的指针而不实stack的指针要注意
sNODE botton;
}STACK,*sSTACK;
//建立空栈
void init(sSTACK s)
{
s->top=(sNODE)malloc(sizeof(NODE));//malloc开辟内存有可能失败
if(s->top==NULL)//如果开辟失败
{
printf("内存分配失败");
}
else
{
s->botton=s->top;
s->botton->next=NULL;
}
}
///入栈
void push(sSTACK s,int e)
{
sNODE new=(sNODE)malloc(sizeof(NODE));
new->num=e;
new->next=s->top;//不能写成s->botton,因为在超过两个以外的节点的时候,因为botton不动,只有top动所以要指向top
s->top=new;
}
//例遍
void traverse(sSTACK s)
{
sNODE r=s->top;//需要新建一个指针来进行例遍,不能用top指针,因为如果移动了top指针就会把栈摧毁,而我们只是想例遍
while(r!=s->botton)
{
printf("%d",r->num);
r=r->next;
}
printf("\n");
}
//判断是不是空栈
bool empty(sSTACK s)
{
if(s->botton==s->top)
{
return true;
}
else
{
return false;
}
}
/出栈
bool pop(sSTACK s,int e)
{
if(empty(s))//判断是不是空栈
{
return false;
}
else
{
sNODE r;
r=s->top;
s->top=r->next;
free(r);
return true;
}
}
//清空
void clear_(sSTACK s)
{
if(empty(s))
{
return;
}
else
{
sNODE p=s->top;
sNODE q;
while(p!=s->botton)
{
q=p->next;
free(p);
p=q;
}
s->top=s->botton;//如果没有这一步,在进行clear_后的遍历的时候由于top没有指向botton所以r没有数据可以输出会报错,应加上这一步
return ;
}
}
void destroyStack(sSTACK s)
{
}
int main()
{
STACK s;
init(&s);//目的是造出一个空栈,并且注意一定要先建立一个空栈否则会报错
push(&s,1);//压栈
push(&s,2);
push(&s,3);
traverse(&s);//遍历输出
clear_(&s);//清空栈
traverse(&s);//清空后输出
if(pop(&s,3))//如果不是空栈
{
printf("出栈成功");
}
else//如果是空栈
{
printf("出栈失败");
}
traverse(s);
}
链式栈的基本操作
最新推荐文章于 2022-10-30 20:11:09 发布