C语言对栈的实现基本操作
C语言对栈的实现基本操作,操作如下:
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdbool.h>
typedefstructNode
{
intdata;
structNode*pNext;
}NODE,*PNODE;
typedefstructStack
{
PNODEpTop;
PNODEpBottom;
}STACK,*PSTACK;//PSTACK等价于structSTACK*
voidinit(PSTACK);//初始化栈
voidpush(PSTACK,int);//压栈
voidtraverse(PSTACK);//遍历
boolpop(PSTACKpS,int*pVal);//出栈
voidclear(PSTACKpS);//清空栈
intmain(void)
{
STACKS;//STACK等价于structStack
intval;
init(&S);//造出空栈
push(&S,1);//压栈
push(&S,2);
push(&S,3);
push(&S,4);
push(&S,5);
push(&S,6);
traverse(&S);//遍历输出
/*
if(pop(&S,&val))
{
printf("出栈成功,出栈的元素是%d\n",val);
}
else
{
printf("出栈失败!\n");
}
*/
clear(&S);
traverse(&S);
return0;
}
voidinit(PSTACKpS)
{
pS->pTop=(PNODE)malloc(sizeof(NODE));
if(NULL==pS->pTop)
{
printf("动态内存分配失败\n");
exit(-1);
}
else
{
pS->pBottom=pS->pTop;
pS->pTop->pNext=NULL;
}
}
voidpush(PSTACKpS,intval)
{
PNODEpNew=(PNODE)malloc(sizeof(NODE));//创建新的节点
pNew->data=val;//将val的值赋给新节点的数据域
pNew->pNext=pS->pTop;//将新节点的指针域指向下一个节点.pS->Top不能改写成pS->Bottom
pS->pTop=pNew;//pTop指向新节点
return;
}
voidtraverse(PSTACKpS)
{
PNODEp=pS->pTop;
while(p!=pS->pBottom)
{
printf("%d",p->data);
p=p->pNext;
}
printf("\n");
return;
}
boolempty(PSTACKpS)
{
if(pS->pTop==pS->pBottom)
{
returntrue;
}
else
{
returnfalse;
}
}
boolpop(PSTACKpS,int*pVal)
{
if(empty(pS))
{
returnfalse;
}
else
{
PNODEr=pS->pTop;
*pVal=r->data;
pS->pTop=r->pNext;
free(r);
r=NULL;
returntrue;
}
}
//清空栈
voidclear(PSTACKpS)
{
if(empty(pS))//如果
{
return;
}
else
{
PNODEp=pS->pTop;//定义元素p指向栈顶元素
PNODEq=NULL;//定义元素q,初始值为空
while(p!=pS->pBottom)//如果栈不为空
{
q=p->pNext;//q指向p的下一个元素
free(p);//释放p所指向的栈顶元素
p=q;//将q所指向的元素赋给p
}
pS->pTop=pS->pBottom;
}
}
希望本文所述对大家c程序设计有所帮助。