1.链栈的结构
其节点结构与单链表的结构相同,即节点结构为:
typedef struct node{
DataType data;
struct node *next;
}StackNode,*PStackNode;
定义一个栈:
typedef struct{
PStackNode top;
}LinkStack,*PLinkStack;
PLinkStack S;
S=(PLinkStack)malloc(sizeof(LinkStack));
栈的链式存储图如下:
2.初始化空栈
/***
初始化链栈,入口参数:空
返回值:链栈指针,null表示初始化失败
***/
PLinkStack Init_LinkStack()
{
PLinkStack S;
S=(PLinkStack)malloc(sizeof(LinkStack));
if(s)
S->top=NULL;
return (S);
}
3.判栈空
/***
判断链栈是否为空,入口参数:链栈指针
返回值:1栈空,0非空
***/
int Empty_LinkStack(PLinkStack S)
{
return(S->top==NULL)
}
4.入栈
/***
入口参数:链栈指针,进栈元素
返回值:1成功,0失败
***/
int Push_LinkStack(PLinkStack S,DataType x)
{
PStackNode p;
p=(PStackNode)malloc(sizeof(StackNode)); //申请节点存储空间
if(!p)
{
printf("内存溢出");
return(0);
}
p->data=x;
p->next=S->top;
S->top=p->next;
return (1);
}
5.出栈
/***
出栈,返回值:1成功,0失败,*X保存被删除的元素值
***/
int Pop_LinkStack(PLinkStack S,Datatype *x)
{
PLinkStack p;
if(Empty_LinkStack(S))
{
printf("栈空,不能出栈");
return 0;
}
*x=S->top->data;
p=S->top;
S->top=S->top->next;
free(p);
return (1);
}
6.取栈顶元素
/***
取栈顶元素 入口参数:链栈指针,出栈元素存放空间地址
返回值:1成功,0失败
***/
int GetTop_LinkStack(PLinkStack S,DataType *x)
{
if(Empty_LinkStack(S))
{
printf("栈空");
return(0);
}
*x=S->top->data;
return(1);
}
7.销毁栈
链栈被构造,使用完后,必须要销毁,否则可能会造成申请的内存不能被释放
/***
销毁栈,入口参数:要销毁的链栈指针地址,无返回值
***/
void Destory_LinkStack(PLinkStack LS)
{
PStackNode p,q;
if(*LS)
{
p=(*LS)->top;
while(p)
{
q=p;
p=p->next;
free(q);
}
free(*LS);
}
*LS=NULL;
return ;
}