1 #include <stdio.h> //增+删+取栈顶+初始化+判空+输出+销毁 2 #include <stdlib.h> 3 #include <malloc.h> 4 typedef int DataType; 5 typedef struct Node { 6 DataType data; 7 struct Node *next; 8 }Node; 9 10 Node * InitStack(Node*top); 11 Node * Push(Node * top,DataType x); 12 Node * GetTop(Node*top,DataType *ptr); 13 Node * Pop(Node * top,DataType * ptr); 14 void DestoryStack(Node * top); 15 int Empty(Node * top); 16 17 int main(){ 18 DataType x; 19 Node * top = InitStack(top); 20 printf("对15和10执行入栈操作: "); 21 top = Push(top,15); 22 top = Push(top,10); 23 top = GetTop(top,&x); 24 printf("当前栈顶元素为:%d ",x); 25 top = Pop(top,&x); 26 printf("执行一次出栈操作,删除元素:%d ",x); 27 top =GetTop(top,&x); 28 printf("当前栈顶元素为:%d ",x); 29 printf("请输入待入栈元素:"); 30 scanf("%d",&x); 31 Push(top,x); 32 if(Empty(top)==1) 33 printf("栈为空 "); 34 else 35 printf("栈非空 "); 36 DestoryStack(top); 37 return 0; 38 } 39 //初始化 40 Node * InitStack(Node*top){ 41 top=NULL; //栈顶置为空 42 printf("初始化成功! "); 43 return top; 44 } 45 //入栈 46 Node * Push(Node * top,DataType x){ 47 Node * s = (Node *)malloc(sizeof(Node)); //malloc申请第一个结点,赋给指向该结点的栈顶指针------- * s 48 s -> data = x; //为节点的data属性赋值 49 s -> next = top; //为节点的next指向前一个节点 50 top = s; //栈顶指针指向新节点 51 printf("%d入栈成功! ",x); 52 return top; 53 } 54 Node * GetTop(Node*top,DataType *ptr){ 55 if(top==NULL){ //判断是否是空栈-----栈顶是否为空 56 printf("下溢错误,取栈顶失败 "); 57 return 0; 58 } 59 *ptr = top->data; //将栈顶Top的data域赋值给*ptr(指针参数*ptr的值会传回主函数) 60 return top; 61 } 62 //销毁 63 void DestoryStack(Node * top){ 64 Node * p = top; //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 65 while(top!=NULL){ //只要栈顶不为null就循环 66 top = top -> next; //循环下移栈顶Top 67 free(p); //释放p 68 p = top; //重复使用指针 * p 进行下一轮循环删除,直至栈顶Top为空 69 } 70 } 71 //弹栈 72 Node * Pop(Node * top,DataType * ptr){ 73 Node * p = top ; //声明一个指向待删除节点的指针 ------ * p (防止丢失,后面要手动释放) 74 if(top==NULL){ //判断是否为空栈 75 printf("下溢错误,删除失败 "); 76 return 0; 77 } 78 * ptr = top->data; //将待删除节点的data值赋给 * ptr 供给主函数 79 top = top->next; //栈顶Top向栈底移动一位 80 free(p); //手动释放待删除节点 81 return top; 82 } 83 //判空 84 int Empty(Node * top){ 85 if(top==NULL) //栈顶Top是否为null 86 return 1; 87 else 88 return 0; 89 }
分析都在注释里啦~就不分块说啦~反而觉得注释还可以更好的对应代码,比之前得笔记好一些呢