主要功能有:栈的初始化,栈的push,栈的pop,栈为空的判断,栈的清空,栈元素的打印
#include<stdio.h> #include<malloc.h> typedef struct Node { int val; struct Node* next; }NODE,*PNODE; typedef struct Stack { PNODE top; PNODE bottom; }STACK,*PSTACK; void init(PSTACK ps) { ps->top=(PNODE) malloc(sizeof(NODE)); if(NULL==ps->top) { printf("内存分配失败"); } else { ps->bottom=ps->top;//头部和尾部指向一致 ps->top->next=NULL;//头部或者尾部的next为空 } } void push(PSTACK ps,int val) { PNODE pnew=(PNODE) malloc(sizeof(NODE)); pnew->val=val; pnew->next=ps->top;//让新插入的节点指向top节点 ps->top=pnew;//插入节点后top节点往上移,存放pnew地址,从而指向pnew } bool isempty(PSTACK ps) { if(ps->top==ps->bottom)//栈顶等于栈尾 { return true; }else { return false; } } bool pop(PSTACK ps,int *val) { if(isempty(ps)) { return false; } else { PNODE temp=ps->top;//临时节点存放刚开始top *val=temp->val;//把临时节点值赋给*val,从而改变主函数val ps->top=temp->next;//top指向临时节点的下一个节点 free(temp);//释放临时节点 temp=NULL; return true; } } void print(PSTACK ps) { PNODE p=ps->top; while(p!=ps->bottom)//p不为栈尾,一直打印 { printf("%d\n",p->val); p=p->next; } } void clear(PSTACK ps) { if(isempty(ps)) { return; } PNODE p=ps->top; PNODE q=NULL; while(p!=ps->bottom) { q=p->next;//q一直为的下一个节点 free(p);//释放p p=q;//p指向q } ps->top=ps->bottom; } int main() { STACK s; int val; init(&s); push(&s,1); push(&s,2); push(&s,3); push(&s,4); print(&s); if(pop(&s,&val)) { printf("出栈成功,出栈元素是%d\n",val); } else { printf("出栈失败"); } print(&s); clear(&s); print(&s); }效果: