顺序实现

 
  1. #ifndef STACK_H_INCLUDED 
  2. #define STACK_H_INCLUDED 
  3. #include "ds.h" //for Status,OK ... 
  4. #ifndef ElemType 
  5. #define ElemType int /* 数据元素类型默认为 int */ 
  6. #define ELEMTYPE_TAG 
  7. #endif 
  8. #define SElemType ElemType 
  9. /// 
  10. //顺序栈的存储结构定义  
  11. #define STACK_INIT_SIZE 100 /* 存储空间初始分配容量 */ 
  12. #define STACKINCREMENT 10 /* 存储空间分配的增量 */ 
  13. typedef struct { 
  14.     ElemType *base; //在构造栈之前和销毁栈之后,base为NULL 
  15.     ElemType *top; //栈顶指针 
  16.     int stacksize; //当前已分配的存储空间(元素个数)  
  17. } SqStack; 
  18. /// 
  19. //顺序栈的基本操作声明 
  20. //构造一个空栈S  
  21. Status InitStack(SqStack &S); 
  22. //销毁栈S  
  23. Status DestroyStack(SqStack &S); 
  24. //将栈S清空  
  25. Status ClearStack(SqStack &S); 
  26. //若栈S为空返回TRUE,否则FALSE  
  27. Status StackEmpty(SqStack S); 
  28. //返回栈S中的元素个数 
  29. int    StackLength(SqStack S); 
  30. //用e返回栈顶元素 
  31. //    前提:栈S存在且不空  
  32. Status GetTop(SqStack S, ElemType &e); 
  33. //元素e入栈S  
  34. Status Push(SqStack &S, ElemType e); 
  35. //S出栈用e返回出栈元素  
  36. //    前提:栈S存在且不空  
  37. Status Pop(SqStack &S, ElemType &e); 
  38.  
  39. /// 
  40. //顺序栈的基本操作的实现 
  41.  
  42. //构造一个空栈S  
  43. Status InitStack(SqStack &S) 
  44.     // TODO (#1#): 构造一个空栈S 
  45.     S.base=(ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType)); 
  46.     if(!S.base) exit(OVERFLOW); 
  47.     SS.top=S.base; 
  48.     S.stacksize=STACK_INIT_SIZE
  49.     return OK; 
  50.     //------------------------------------- 
  51.  
  52. //销毁栈S  
  53. Status DestroyStack(SqStack &S) 
  54.     // TODO (#1#):销毁栈S,相当于清空栈  
  55.     free(S.base); 
  56.     S.base=NULL
  57.     return OK; 
  58.     //------------------------------------- 
  59.  
  60. //将栈S清空  
  61. Status ClearStack(SqStack &S) 
  62.     // TODO (#1#): 将栈S清空,释放所有结点 
  63.     ElemType e; 
  64.     while(Pop(S,e)!=ERROR); 
  65.     return OK; 
  66.     //------------------------------------- 
  67.  
  68. //若栈S为空返回TRUE,否则FALSE  
  69. Status StackEmpty(SqStack S) 
  70.     // TODO (#1#): 若栈S为空返回TRUE,否则FALSE 
  71.     if(S.top==S.base) 
  72.         return OK; 
  73.     return ERROR; 
  74.     //------------------------------------- 
  75.  
  76. //返回栈S中的元素个数 
  77. int    StackLength(SqStack S) 
  78.     // TODO (#1#): 返回栈S中的元素个数 
  79.     return S.top-S.base; 
  80.     //------------------------------------- 
  81.  
  82. //用e返回栈顶元素 
  83. //    前提:栈S存在且不空  
  84. Status GetTop(SqStack S, ElemType &e) 
  85.     // TODO (#1#):若栈S不空,则用e返回栈顶元素 
  86.     if(S.top ==S.base) 
  87.         return ERROR; 
  88.     e=*(S.top-1); 
  89.     return OK; 
  90.     //------------------------------------- 
  91.  
  92. //元素e入栈S  
  93. Status Push(SqStack &S, ElemType e) 
  94.     // TODO (#1#): 插入元素e作为新的栈顶  
  95.     if(S.top-S.base>=S.stacksize) 
  96.     { 
  97.         S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType)); 
  98.         if(!S.base)exit(OVERFLOW); 
  99.         SS.top=S.base+S.stacksize; 
  100.         S.stacksize+=STACKINCREMENT; 
  101.     } 
  102.     *S.top++=e; 
  103.     //*S.top=e
  104.     //S.top++; 
  105.     return OK; 
  106.     //------------------------------------- 
  107.  
  108. //S出栈用e返回出栈元素  
  109. //    前提:栈S存在且不空  
  110. Status Pop(SqStack &S, ElemType &e) 
  111.     // TODO (#1#):若栈S不空,则删除栈顶元素用e返回 
  112.     if(S.top==S.base)  
  113.     return ERROR; 
  114.     e=*--S.top; 
  115.     return OK; 
  116.     //------------------------------------- 
  117.  
  118.  
  119. #ifdef ELEMTYPE_TAG 
  120. #undef ElemType 
  121. #undef ELEMTYPE_TAG 
  122. #endif 
  123.  
  124. #endif 
 
  1. #include <stdio.h> 
  2. #include <stdlib.h> //for system() 
  3. #include "stack.h" //for SqStack  
  4.  
  5. //测试顺序栈的主程序 
  6. int main() 
  7.     SqStack s; 
  8.     int x; 
  9.     //输入若干正整数以0结束,依次入栈,然后依次出栈并打印 
  10.     InitStack(s); 
  11.      
  12.     printf("输入若干正整数以0结束:"); 
  13.     scanf("%d",&x); 
  14.     while(x!=0) { 
  15.         Push(s,x); 
  16.         scanf("%d",&x); 
  17.     } 
  18.      
  19.     printf("\n出栈结果:"); 
  20.     while(!StackEmpty(s)) { 
  21.         Pop(s,x); 
  22.         printf("%4d",x); 
  23.     } 
  24.      
  25.      
  26.     //------------------------------------- 
  27.     // TODO (#1#): 其它测试程序  
  28.      
  29.     //------------------------------------- 
  30.      
  31.     DestroyStack(s); //销毁栈  
  32.      
  33.     system("PAUSE");     
  34.     return 0; 

链式实现

 
  1. #ifndef STACK_H_INCLUDED 
  2. #define STACK_H_INCLUDED 
  3.  
  4. #include "ds.h" //for Status,OK ... 
  5.  
  6. #ifndef ElemType 
  7. #define ElemType int /* 数据元素类型默认为 int */ 
  8. #define ELEMTYPE_TAG 
  9. #endif 
  10.  
  11.  
  12. /// 
  13. //链栈的存储结构定义  
  14. typedef struct LNode { 
  15.     ElemType data; 
  16.     struct LNode *next; 
  17. } LNode, *LinkList; 
  18.  
  19. typedef LinkList LinkStack; //链栈类型  
  20.  
  21. /// 
  22. //链栈的基本操作声明 
  23.  
  24. //构造一个空栈S  
  25. Status InitStack(LinkStack &S); 
  26. //销毁栈S  
  27. Status DestroyStack(LinkStack &S); 
  28. //将栈S清空  
  29. Status ClearStack(LinkStack &S); 
  30. //若栈S为空返回TRUE,否则FALSE  
  31. Status StackEmpty(LinkStack S); 
  32. //返回栈S中的元素个数 
  33. int    StackLength(LinkStack S); 
  34. //用e返回栈顶元素 
  35. //    前提:栈S存在且不空  
  36. Status GetTop(LinkStack S, ElemType &e); 
  37. //元素e入栈S  
  38. Status Push(LinkStack &S, ElemType e); 
  39. //S出栈用e返回出栈元素  
  40. //    前提:栈S存在且不空  
  41. Status Pop(LinkStack &S, ElemType &e); 
  42.  
  43. /// 
  44. //链栈的基本操作的实现 
  45.  
  46. //构造一个空栈S  
  47. Status InitStack(LinkStack &S) 
  48.     // TODO (#1#): 构造一个空栈S,不带头结点 
  49.     S=(LinkStack)malloc(sizeof(LNode)); 
  50.     if(!S) return ERROR; 
  51.     S->next=NULL
  52.     return OK; 
  53.     //------------------------------------- 
  54.  
  55. //销毁栈S  
  56. Status DestroyStack(LinkStack &S) 
  57.     // TODO (#1#):销毁栈S,相当于清空栈 
  58.     LinkStack p; 
  59.     while(S) 
  60.     { 
  61.        p=S->next; 
  62.        free(S); 
  63.        S=p
  64.     } 
  65.     return OK; 
  66.     //------------------------------------- 
  67.  
  68. //将栈S清空  
  69. Status ClearStack(LinkStack &S) 
  70.     // TODO (#1#): 将栈S清空,释放所有结点 
  71.     LinkStack p,q; 
  72.     p=S->next; 
  73.     while(p) 
  74.     { 
  75.        q=p->next; 
  76.        free(p); 
  77.        p=q
  78.     } 
  79.     S->next=NULL
  80.     return OK; 
  81.     //------------------------------------- 
  82.  
  83. //若栈S为空返回TRUE,否则FALSE  
  84. Status StackEmpty(LinkStack S) 
  85.     // TODO (#1#): 若栈S为空返回TRUE,否则FALSE 
  86.     if(S==NULL) 
  87.     return 1; 
  88.     else 
  89.         return 0; 
  90.     //------------------------------------- 
  91.  
  92. //返回栈S中的元素个数 
  93. int    StackLength(LinkStack S) 
  94.     // TODO (#1#): 返回栈S中的元素个数 
  95.     LinkStack p; 
  96.     int x=0
  97.     p=S->next; 
  98.     while(p!=NULL) 
  99.     { 
  100.        x++; 
  101.        pp=p->next; 
  102.     } 
  103.     return x; 
  104.     //------------------------------------- 
  105.  
  106. //用e返回栈顶元素 
  107. //    前提:栈S存在且不空  
  108. Status GetTop(LinkStack S, ElemType &e) 
  109.     // TODO (#1#):若栈S不空,则用e返回栈顶元素 
  110.     if(S==NULL) exit(OVERFLOW); 
  111.     e=S->data; 
  112.     return OK; 
  113.     //------------------------------------- 
  114.  
  115. //元素e入栈S  
  116. Status Push(LinkStack &S, ElemType e) 
  117.     // TODO (#1#): 插入元素e作为新的栈顶  
  118.     LinkStack p; 
  119.     p=(LinkStack)malloc(sizeof(LNode)); 
  120.     if(!p)exit(OVERFLOW); 
  121.     p->data=e
  122.     p->next=NULL
  123.     p->next=S->next; 
  124.     S->next=p
  125.     return OK; 
  126.     //------------------------------------- 
  127.  
  128. //S出栈用e返回出栈元素  
  129. //    前提:栈S存在且不空  
  130. Status Pop(LinkStack &S, ElemType &e) 
  131.     // TODO (#1#):若栈S不空,则删除栈顶元素用e返回  
  132.     if(S==NULL) return ERROR; 
  133.     e=S->data; 
  134.     SS=S->next; 
  135.     return OK; 
  136.     //------------------------------------- 
  137.  
  138.  
  139. #ifdef ELEMTYPE_TAG 
  140. #undef ElemType 
  141. #undef ELEMTYPE_TAG 
  142. #endif 
  143.  
  144. #endif 

 

 
  1. #include <stdio.h> 
  2. #include <stdlib.h> //for system() 
  3. #include "stack.h" //链栈  
  4.  
  5. //测试链栈的主程序 
  6. int main() 
  7.     LinkStack s; 
  8.     int x; 
  9.     //输入若干正整数以0结束,依次入栈,然后依次出栈并打印 
  10.     InitStack(s); 
  11.      
  12.     printf("输入若干正整数以0结束:"); 
  13.     scanf("%d",&x); 
  14.     while(x!=0) { 
  15.         Push(s,x); 
  16.         scanf("%d",&x); 
  17.     } 
  18.      
  19.     printf("\n出栈结果:"); 
  20.     while(!StackEmpty(s)) { 
  21.         Pop(s,x); 
  22.         printf("%4d",x); 
  23.     } 
  24.      
  25.      
  26.     //------------------------------------- 
  27.     // TODO (#1#): 其它测试程序  
  28.      
  29.     //------------------------------------- 
  30.      
  31.     DestroyStack(s); //销毁栈  
  32.      
  33.     system("PAUSE");     
  34.     return 0;