通用栈的C语言实现

2748阅读 0评论2011-08-26 suanmeilizhi
分类:C/C++

最近在看C算法,想到一个问题,怎样实现一个通用栈,即实现代码的重用。一个比较实际的例子就是需要在一段程序中生成一个整形栈和一个字符栈。实现过程主要依靠void *指针,它可以表示任何类型的指针。
stackDef.h文件,定义结构体。
  1. 1 /*stackDef.h*/
  2.   2 #ifndef STACKDEF_H
  3.   3 #define STACKDEF_H
  4.   4 #include <stdio.h>
  5.   5
  6.   6
  7.   7 struct Node{
  8.   8 void *ptext;
  9.   9 struct Node *pnext;
  10.  10 };
  11.  11 typedef struct Node Node;
  12.  12
  13.  13 typedef struct Stack{
  14.  14 int count;
  15.  15 size_t data_size;
  16.  16 Node *phead;
  17.  17 }Stack;
  18.  18
  19.  19 #endif
stackOpe.h定义栈的操作。
  1. 1 #ifndef STACKOPE_H
  2.   2 #define STACKOPE_H
  3.   3 #include <stdlib.h>
  4.   4 #include <stdio.h>
  5.   5 #include "stackDef.h"
  6.   6
  7.   7
  8.   8 void init(Stack * const pstk, const size_t data_size);
  9.   9 int isempty(Stack *pstk);
  10.  10 int push(Stack *pstk, const void *ptext);
  11.  11 int pop(Stack *pstk, void *prst);
  12.  12
  13.  13 #endif
stackOpe.c
  1. 1 #include "stackOpe.h"
  2. 2 #include "stackDef.h"
  3. 3 #include
  4. 4 #include
  5. 5
  6. 6 void init(Stack * const pstk, const size_t data_size)
  7. 7 {
  8. 8 assert(pstk != NULL);
  9. 9 assert(data_size > 0);
  10. 10
  11. 11 pstk->count = 0;
  12. 12 pstk->phead = NULL;
  13. 13 pstk->data_size = data_size;
  14. 14
  15. 15 }
  16. 16
  17. 17 int isempty(Stack *pstk)
  18. 18 {
  19. 19 return pstk->count == 0;
  20. 20 }
  21. 21
  22. 22 int push(Stack *pstk, const void *ptext)
  23. 23 {
  24. 24 Node *ptmp;
  25. 25 assert(pstk != NULL);
  26. 26 assert(ptext != NULL);
  27. 27
  28. 28 ptmp = (Node *)malloc(sizeof(Node));
  29. 29 if(ptmp == NULL)
  30. 30 return 0;
  31. 31 ptmp->ptext = malloc(pstk->data_size);
  32. 32 if(ptmp->ptext == NULL)
  33. 33 return 0;
  34. 34 memcpy(ptmp->ptext, ptext, pstk->data_size);
  35. 35 ptmp->pnext = pstk->phead;
  36. 36 pstk->phead = ptmp;
  37. 37 pstk->count++;
  38. 38 return 1;
  39. 39 }
  40. 40
  41. 41 int pop(Stack *pstk, void *prst)
  42. 42 {
  43. 43 assert(pstk != NULL);
  44. 44
  45. 45 if(isempty(pstk) != 1)
  46. 46 {
  47. 47 memcpy(prst, pstk->phead->ptext, pstk->data_size);
  48. 48 free(pstk->phead->ptext);
  49. 49 Node *ptmp = pstk->phead->pnext;
  50. 50 free(pstk->phead);
  51. 51 pstk->phead = ptmp;
  52. 52 pstk->count--;
  53. 53 return 1;
  54. 54 }else
  55. 55 return 0;
  56. 56
  57. 57 }
现在就实现了一个通用栈,嘎嘎
上一篇:快速排序quicksort的C实现
下一篇:选择排序C语言实现