栈的实现

 首先还是数据结构的定义:

typedef struct Stack
{
  SElemType *base;
  SElemType *top ;
  int stacksize;
}SqStack;

    下面是各种操作的具体的实现,因为栈和队列在后面的树的操作中,会经常的用到,所以,这里会影响到后面树的实现。

Status InitStack(SqStack *S)
{//构造一个空栈

  if(!(S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType))))
    exit(OVERFLOW);
  S->top = S->base;
  S->stacksize = STACK_INIT_SIZE;
  return OK;
}

Status DestroyStack(SqStack S)
{//销毁栈S

  free(S.base);
  S.base = NULL;
  S.top = NULL;
  S.stacksize = 0;
  return OK;
}

Status ClearStack(SqStack S)
{//把栈S置空

  S.top = S.base;
  return OK;
}

Status StackEmpty(SqStack S)
{//若栈S为空,则返回TRUE,否则返回FALSE

  if(S.top == S.base)
    return TRUE;
  else
    return FALSE;
}

int StackLength(SqStack S)
{//返回S的元素个数,也就是栈的长度

  return S.top - S.base;
}

Status GetTop(SqStack S,SElemType *e)
{//用e返回栈顶元素

  if(S.top > S.base)
  {
    *= *(S.top -1);
    return OK;
  }
  else
    return ERROR;
}

Status Push(SqStack *S,SElemType e)
{//插入元素e为栈顶元素

  if(S->top - S->base >=S->stacksize)
  {
    S->base=(SElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT) * sizeof(SElemType));
    if(!S->base)
      exit(OVERFLOW);
     
    S->top = S->base + S->stacksize;
    S->stacksize +=STACKINCREMENT;
  }
  *(S->top)++=e;
  return OK;
}

Status Pop(SqStack *S,SElemType *e)
{//删除栈顶元素,用e返回其值

  if(S->top == S->base)
    return ERROR;
  *= *--S->top;
  return OK;
}

Status StackTraverse(SqStack S,Status(*visit)(SElemType))
{// 输出栈顶元素

  while(S.top > S.base)
    visit(*S.base++);
  printf("\n");
  return OK;
}

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

头文件Stack.h

[cpp]  view plain copy
  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

[cpp]  view plain copy
  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

[cpp]  view plain copy
  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.   
  12.     printf("0-9依次入栈并输出如下:\n");  
  13.     for(i=0;i<10;i++)  
  14.     {  
  15.         Push(ps,i);  
  16.         GetTop(ps,&item);  
  17.         printf("%d ",item);  
  18.     }  
  19.       
  20.     printf("\n从栈顶到栈顶遍历并对每个元素执行print函数:\n");  
  21.     StackTraverse(ps,print);  
  22.   
  23.     printf("栈中元素依次出栈并输出如下:\n");  
  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("\n将栈置空成功\n");  
  33.     DestroyStack(ps);  
  34.     printf("栈已被销毁\n");  
  35.           
  36. }  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值