1. 程式人生 > >C語言一個棧的實現

C語言一個棧的實現

棧是常用的資料結構之一,下面給出一個鏈式棧的實現~~

標頭檔案Stack.h

  1. #ifndef Stack_H
  2. #define Stack_H
  3. typedefint Item;  
  4. typedefstruct node * PNode;  
  5. /*定義棧節點型別*/
  6. typedefstruct node  
  7. {  
  8.     Item data;  
  9.     PNode down;  
  10. }Node;  
  11. /*定義棧型別*/
  12. typedefstruct stack  
  13. {  
  14.     PNode top;  
  15.     int size;  
  16. }Stack;  
  17. /*構造一個空棧*/
  18. Stack *InitStack();  
  19. /*銷燬一個棧*/
  20. void DestroyStack(Stack *ps);  
  21. /*把棧置空*/
  22. void ClearStack(Stack *ps);  
  23. /*判定是否為空棧*/
  24. int IsEmpty(Stack *ps);  
  25. /*返回棧大小*/
  26. int GetSize(Stack *ps);  
  27. /*返回棧頂元素*/
  28. PNode GetTop(Stack *ps,Item *pitem);  
  29. /*元素入棧*/
  30. PNode Push(Stack *ps,Item item);  
  31. /*元素出棧*/
  32. PNode Pop(Stack *ps,Item *pitem);  
  33. /*遍歷棧並訪問visit函式*/
  34. void
     StackTraverse(Stack *ps,void (*visit)(Item item));  
  35. #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. int IsEmpty(Stack *ps)  
  17. {  
  18.     if(ps->top == NULL && ps->size == 0)  
  19.         return 1;  
  20.     else
  21.         return 0;  
  22. }  
  23. /*返回棧大小*/
  24. int GetSize(Stack *ps)  
  25. {  
  26.     return ps->size;  
  27. }  
  28. /*元素入棧*/
  29. PNode Push(Stack *ps,Item item)  
  30. {  
  31.     PNode pnode = (PNode)malloc(sizeof(Node));  
  32.     if(pnode != NULL)  
  33.     {  
  34.         pnode->data = item;  
  35.         pnode->down = GetTop(ps,NULL);  
  36.         ps->size++;  
  37.         ps->top = pnode;  
  38.     }  
  39.     return pnode;  
  40. }  
  41. /*返回棧頂元素*/
  42. PNode GetTop(Stack *ps,Item *pitem)  
  43. {  
  44.     if(IsEmpty(ps)!=1&&pitem!=NULL)  
  45.     {  
  46.         *pitem = ps->top->data;  
  47.     }  
  48.     return ps->top;  
  49. }  
  50. /*元素出棧*/
  51. PNode Pop(Stack *ps,Item *pitem)  
  52. {  
  53.     PNode p = ps->top;  
  54.     if(IsEmpty(ps)!=1&&p!=NULL)  
  55.     {  
  56.         if(pitem!=NULL)  
  57.             *pitem = p->data;  
  58.         ps->size--;  
  59.         ps->top = ps->top->down;     
  60.         free(p);  
  61.     }  
  62.     return ps->top;  
  63. }  
  64. /*銷燬一個棧*/
  65. void DestroyStack(Stack *ps)  
  66. {  
  67.     if(IsEmpty(ps)!=1)  
  68.         ClearStack(ps);  
  69.     free(ps);  
  70. }  
  71. /*把棧置空*/
  72. void ClearStack(Stack *ps)  
  73. {  
  74.     while(IsEmpty(ps)!=1)  
  75.     {  
  76.         Pop(ps,NULL);  
  77.     }  
  78. }  
  79. /*遍歷棧並訪問visit函式 */
  80. void StackTraverse(Stack *ps,void (*visit)(Item item))  
  81. {  
  82.     PNode p = ps->top;  
  83.     int i = ps->size;  
  84.     while(i--)  
  85.     {  
  86.         visit(p->data);  
  87.         p = p->down;  
  88.     }  
  89. }  


測試部分Test.c

  1. #include"Stack.h"
  2. #include<stdio.h>
  3. void print(Item i)  
  4. {  
  5.     printf("該節點元素為%d\n",i);  
  6. }  
  7. main()  
  8. {  
  9.     Stack *ps = InitStack();  
  10.     int i,item;  
  11.     printf("0-9依次入棧並輸出如下:\n");  
  12.     for(i=0;i<10;i++)  
  13.     {  
  14.         Push(ps,i);  
  15.         GetTop(ps,&item);  
  16.         printf("%d ",item);  
  17.     }  
  18.     printf("\n從棧頂到棧頂遍歷並對每個元素執行print函式:\n");  
  19.     StackTraverse(ps,print);  
  20.     printf("棧中元素依次出棧並輸出如下:\n");  
  21.     for(i=0;i<10;i++)  
  22.     {  
  23.         Pop(ps,&item);  
  24.         printf("%d ",item);  
  25.     }  
  26.     ClearStack(ps);  
  27.     if(IsEmpty(ps))  
  28.         printf("\n將棧置空成功\n");  
  29.     DestroyStack(ps);  
  30.     printf("棧已被銷燬\n");  
  31. }