这里我们假设栈顶指针指示栈顶元素的提前一个位置

 
  
  1. #include <stdio.h>  
  2. #include <malloc.h>  
  3.  
  4. #define STACK_INIT_SIZE 100  
  5. #define STACKINCREMENT 10  
  6.  
  7. typedef char ElemType;  
  8. typedef struct 
  9. {  
  10.  ElemType *base; //栈底指针  
  11.  ElemType *top;  //栈顶指针  
  12.  int stacksize;  
  13. }sqstack;  
  14.  
  15. void Clearstack(sqstack *s)  
  16. {  
  17.  free(s->base);  
  18. }  
  19.  
  20. void InitStack(sqstack *s)  
  21. {  
  22.  s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));  
  23.  if ( !s->base)  
  24.  {  
  25.   printf("InitStack error!");  
  26.   return;  
  27.  }  
  28.  s->top = s->base;  
  29.  s->stacksize = STACK_INIT_SIZE;  
  30. }  
  31.  
  32. void Push(sqstack *s,ElemType e)  
  33. {  
  34.  if ( s->top - s->base >= s->stacksize)  
  35.  {  
  36.   //指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。  
  37.   //新的大小一定要大于原来的大小不然的话会导致数据丢失!  
  38.   s->base = (ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType));  
  39.   if ( ! s->base)  
  40.   {  
  41.    printf("Increase memory error!");  
  42.       return;  
  43.   }  
  44.   s->top = s->base + s->stacksize;  
  45.   s->stacksize += STACKINCREMENT;  
  46.  }  
  47.  *s->top++ = e;  
  48. }  
  49.  
  50. ElemType Pop(sqstack *s)  
  51. {  
  52.  ElemType x;  
  53.  if ( s->top != s->base)  
  54.  {  
  55.   x = *--s->top;  
  56.   return x;  
  57.  }  
  58.  else 
  59.  {  
  60.   printf("栈为空!\n");  
  61.   return ('F');  
  62.  }  
  63. }  
  64.  
  65. int StackLength(sqstack *s)  
  66. {  
  67.  int i = 0;  
  68.  ElemType *p;  
  69.  p = s->top - 1;  
  70.  do 
  71.  {  
  72.   i++;  
  73.   p--;  
  74.  } while (p != s->base - 1);  
  75.  return i;  
  76. }  
  77.  
  78. int StackEmpty(sqstack *s)  
  79. {  
  80.  return(s->top == s->base);  
  81. }  
  82.  
  83. ElemType Gettop(sqstack *s)  
  84. {  
  85.  ElemType e;  
  86.  if ( s->top == s->base )  
  87.  {  
  88.   printf("栈为空!\n");  
  89.   return ('F');  
  90.  }  
  91.  e = *(s->top -1);  
  92.  return e;  
  93. }  
  94.  
  95. void output(sqstack *s)  
  96. {  
  97.  ElemType *p;  
  98.  p = s->top - 1;  
  99.  do 
  100.  {  
  101.   printf("%c",*p);  
  102.   p--;  
  103.  } while ( p != s->base - 1);  
  104.  printf("\n");  
  105. }  
  106.  
  107. void main()  
  108. {  
  109.  ElemType e;  
  110.  sqstack *s;  
  111.  s = (sqstack *)malloc(sizeof(sqstack));  
  112.  InitStack(s);  
  113.  printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));  
  114.  Push(s,'v');  
  115.  Push(s,'o');  
  116.  Push(s,'y');  
  117.  Push(s,'e');  
  118.  Push(s,'v');  
  119.  Push(s,'o');  
  120.  Push(s,'l');  
  121.  Push(s,'i');  
  122.  printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));  
  123.  printf("栈长度:%d\n",StackLength(s));  
  124.  printf("栈顶元素:%c\n",Gettop(s));  
  125.  output(s);  
  126.  while (!StackEmpty(s))  
  127.  {  
  128.   e = Pop(s);  
  129.   printf("%c",e);  
  130.  }  
  131.  printf("\n");  
  132.  printf("栈为:%s\n",(StackEmpty(s)?"空":"非空"));  
  133.  printf("释放栈中...\n");  
  134.  Clearstack(s);  
  135.  printf("释放栈完成!\n");  
  136. }  
  137.