链栈常规插入删除操作
#include <stdio.h>
#include <stdlib.h>
typedef int DataType;
struct Node
{
DataType data;
struct Node*next;
};
typedef struct Node*PNode;//节点类型
typedef struct Node*top,*LinkStack;//栈顶和链栈类型
LinkStack SetNullStack_Link()//创建空链栈
{
LinkStack top=(LinkStack)malloc(sizeof(struct Node));
if(top!=NULL)
{
top->next=NULL;
}
else
{
printf("alloc failure");
}
return top;
}
void Push_Link(LinkStack top,DataType x)//进栈,不需要判断链栈是否会溢出
{
PNode p=(PNode)malloc(sizeof(struct Node));//申请节点空间
if(p==NULL)
{
printf("alloc failure");
}
else//相当于链表头插法
{
p->data=x;//数据域赋值
p->next=top->next;//指针域赋值
top->next=p;//修改栈顶
}
}
int IsNullStack_Link(LinkStack top)//判断栈是否为空
{
if(top->next==NULL)
return 1;
else
return 0;
}
void Pop_Link(LinkStack top)//删除栈顶元素,需要判空
{
PNode p;
if(top->next==NULL)//判断栈是否为空
printf("it is empty stack!");
else
{
p=top->next;//p指向待删除的节点
top->next=p->next;//修改栈顶指针
free(p);//删除释放节点的空间
}
}
DataType Pop_Link_Return(LinkStack top)//取栈顶元素
{
if(IsNullStack_Link(top)==1)//判断栈是否为空
printf("it is empty stack!");
else
{
return top->next->data;
}
}
int main()
{
LinkStack p=SetNullStack_Link();//创建一个空栈
int data;
printf("请输入进栈的元素,以0结束:");
scanf("%d",&data);
while(data!=0)
{
Push_Link(p,data);//进栈
scanf("%d",&data);
}
printf("出栈元素的顺序是:");
while(!IsNullStack_Link(p))//是否空栈
{
printf("%d ",Pop_Link_Return(p));//取出栈顶元素
Pop_Link(p);//出栈
}
}
输入输出样例如下
还没有评论,来说两句吧...