#include<stdio.h>#include<malloc.h>#include<stdlib.h>//动态栈,由链表实现,上面节点指向下面一个节点//结构体:节点(表示一个元素)typedefstructNode{intdata;structNode*pNext;}NODE,*PNODE;//结构体:栈,栈顶节点的指针,栈底节点指针(栈底指针指向栈底节点的下一个存储空间,因为是初始化的时候分配的空间,此时还没有插入节点)。typedefstructStack{PNODEpTop;PNODEpButtom;}STACK,*PSTACK;//为栈分配内存voidinit(PSTACKpStack);//压栈voidpush(PSTACKpStack,intval);//遍历voidtraverse(PSTACKpStack);//弹栈,把出栈的节点的数据存入给定的变量中(给地址)boolpop(PSTACKpStack,int*val);intmain(void){//初始化STACKstack;init(&stack);//压栈push(&stack,1);push(&stack,2);push(&stack,3);push(&stack,4);//遍历traverse(&stack);//弹栈inta=0;pop(&stack,&a);printf("\n出栈的元素是:%d\n",a);//遍历traverse(&stack);getchar();return0;}//初始化栈voidinit(PSTACKpStack){//为节点分配内存pStack->pTop=(PNODE)malloc(sizeof(NODE));if(pStack->pTop==NULL){printf("动态内存分配失败!\n");exit(-1);}else{//栈顶指针和栈底指针相等,都指向初始节点pStack->pButtom=pStack->pTop;pStack->pTop->pNext=NULL;//初始节点的下个节点为NULL}}//压栈voidpush(PSTACKpStack,intval){//创建一个节点PNODEpNewNode=(PNODE)malloc(sizeof(NODE));pNewNode->data=val;//数据域赋值pNewNode->pNext=NULL;//指针域为空(栈顶)pNewNode->pNext=pStack->pTop;//新加入的节点的下一个节点指向原来的栈顶节点pStack->pTop=pNewNode;//栈顶指针指向新压入的节点return;}//遍历voidtraverse(PSTACKpStack){PNODEpNode=pStack->pTop;while(pNode!=pStack->pButtom){printf("%d\t",pNode->data);pNode=pNode->pNext;}}//弹栈boolpop(PSTACKpStack,int*val){if(pStack->pTop==pStack->pButtom){returnfalse;}*val=pStack->pTop->data;PNODEr=pStack->pTop;//记录栈顶节点pStack->pTop=pStack->pTop->pNext;free(r);r=NULL;//释放原来栈顶节点的空间returntrue;}