链式栈

来源:http://blog.csdn.net/hopeyouknow/article/details/6725049

栈是常用的数据结构之一,下面给出一个链式栈的实现~~

头文件Stack.h

  1. #ifndef Stack_H  
  2. #define Stack_H  
  3.   
  4. typedef int Item;  
  5. typedef struct node * PNode;  
  6. /*定义栈节点类型*/  
  7. typedef struct node  
  8. {  
  9.     Item data;  
  10.     PNode down;  
  11. }Node;  
  12. /*定义栈类型*/  
  13. typedef struct stack  
  14. {  
  15.     PNode top;  
  16.     int size;  
  17. }Stack;  
  18. /*构造一个空栈*/  
  19. Stack *InitStack();  
  20.   
  21. /*销毁一个栈*/  
  22. void DestroyStack(Stack *ps);  
  23.   
  24. /*把栈置空*/  
  25. void ClearStack(Stack *ps);  
  26.   
  27. /*判定是否为空栈*/  
  28. int IsEmpty(Stack *ps);  
  29.   
  30. /*返回栈大小*/  
  31. int GetSize(Stack *ps);  
  32.   
  33. /*返回栈顶元素*/  
  34. PNode GetTop(Stack *ps,Item *pitem);  
  35.   
  36. /*元素入栈*/  
  37. PNode Push(Stack *ps,Item item);  
  38.   
  39. /*元素出栈*/  
  40. PNode Pop(Stack *ps,Item *pitem);  
  41.   
  42. /*遍历栈并访问visit函数*/  
  43. void StackTraverse(Stack *ps,void (*visit)());  
  44.   
  45. #endif  


实现部分Stack.c

  1. #include"Stack.h"  
  2. #include<malloc.h>  
  3. #include<stdlib.h>  
  4. /*构造一个空栈*/  
  5. Stack *InitStack()  
  6. {  
  7.     Stack *ps = (Stack *)malloc(sizeof(Stack));  
  8.     if(ps!=NULL)  
  9.     {  
  10.         ps->top = NULL;  
  11.         ps->size = 0;  
  12.     }  
  13.     return ps;  
  14. }  
  15.   
  16. /*判定是否为空栈*/  
  17. int IsEmpty(Stack *ps)  
  18. {  
  19.     if(ps->top == NULL && ps->size == 0)  
  20.         return 1;  
  21.     else  
  22.         return 0;  
  23. }  
  24.   
  25. /*返回栈大小*/  
  26. int GetSize(Stack *ps)  
  27. {  
  28.     return ps->size;  
  29. }  
  30.   
  31. /*元素入栈*/  
  32. PNode Push(Stack *ps,Item item)  
  33. {  
  34.     PNode pnode = (PNode)malloc(sizeof(Node));  
  35.     if(pnode != NULL)  
  36.     {  
  37.         pnode->data = item;  
  38.         pnode->down = GetTop(ps,NULL);  
  39.         ps->size++;  
  40.         ps->top = pnode;  
  41.           
  42.     }  
  43.     return pnode;  
  44. }  
  45.   
  46. /*返回栈顶元素*/  
  47. PNode GetTop(Stack *ps,Item *pitem)  
  48. {  
  49.     if(IsEmpty(ps)!=1&&pitem!=NULL)  
  50.     {  
  51.         *pitem = ps->top->data;  
  52.     }  
  53.     return ps->top;  
  54. }  
  55.   
  56.   
  57. /*元素出栈*/  
  58. PNode Pop(Stack *ps,Item *pitem)  
  59. {  
  60.     PNode p = ps->top;  
  61.     if(IsEmpty(ps)!=1&&p!=NULL)  
  62.     {  
  63.         if(pitem!=NULL)  
  64.             *pitem = p->data;  
  65.         ps->size--;  
  66.         ps->top = ps->top->down;     
  67.         free(p);  
  68.     }  
  69.     return ps->top;  
  70. }  
  71.   
  72. /*销毁一个栈*/  
  73. void DestroyStack(Stack *ps)  
  74. {  
  75.     if(IsEmpty(ps)!=1)  
  76.         ClearStack(ps);  
  77.     free(ps);  
  78. }  
  79.   
  80. /*把栈置空*/  
  81. void ClearStack(Stack *ps)  
  82. {  
  83.     while(IsEmpty(ps)!=1)  
  84.     {  
  85.         Pop(ps,NULL);  
  86.     }  
  87. }  
  88.   
  89. /*遍历栈并访问visit函数 */  
  90. void StackTraverse(Stack *ps,void (*visit)())  
  91. {  
  92.     PNode p = ps->top;  
  93.     int i = ps->size;  
  94.     while(i--)  
  95.     {  
  96.         visit(p->data);  
  97.         p = p->down;  
  98.     }  
  99. }  


测试部分Test.c

  1. #include"Stack.h"  
  2. #include<stdio.h>  
  3. void print(Item i)  
  4. {  
  5.     printf("该节点元素为%d ",i);  
  6. }  
  7. main()  
  8. {  
  9.     Stack *ps = InitStack();  
  10.     int i,item;  
  11.   
  12.     printf("0-9依次入栈并输出如下: ");  
  13.     for(i=0;i<10;i++)  
  14.     {  
  15.         Push(ps,i);  
  16.         GetTop(ps,&item);  
  17.         printf("%d ",item);  
  18.     }  
  19.       
  20.     printf(" 从栈顶到栈顶遍历并对每个元素执行print函数: ");  
  21.     StackTraverse(ps,print);  
  22.   
  23.     printf("栈中元素依次出栈并输出如下: ");  
  24.     for(i=0;i<10;i++)  
  25.     {  
  26.         Pop(ps,&item);  
  27.         printf("%d ",item);  
  28.     }  
  29.       
  30.     ClearStack(ps);  
  31.     if(IsEmpty(ps))  
  32.         printf(" 将栈置空成功 ");  
  33.     DestroyStack(ps);  
  34.     printf("栈已被销毁 ");  
  35.           
  36. }  
原文地址:https://www.cnblogs.com/heyonggang/p/3272612.html