栈的顺序实现和链式实现

/*
链式栈:链式栈相比顺序栈可以动态的增加和减少栈的大小,可以更加高效的使用内存 。
        链式栈需要为每个元素申请一个指针节点,内存占用比较大。 
*/
#define FAILURE 0         //失败 
#define SUCCEED 1         //成功 
#define NO 0              //否 
#define YES 1             //是 

/* 修改本条代码以自定义栈数据类型 (默认为char型)*/
typedef char SDataType;
/* 修改本条代码以自定义栈数据类型 (默认为char型)*/
 

typedef struct _STACK //栈结构 
{
    SDataType Data;
    struct _STACK *next; 
}STACK;

int InitStack(STACK *S) //初始化栈
{
    S->next=NULL;
    return SUCCEED;
}

int DestroyStack(STACK * &S) //销毁栈(传入指针S的地址) 
{
  STACK *Mid_P;
  while(S)
  {
    Mid_P=S->next;
    free(S);
    S=Mid_P;
  }
  return SUCCEED;
}

int ClearStack(STACK *S) //将栈清空
{
  STACK *Mid_P,*Mid_P2=S->next;
  while(Mid_P2)
  {
     Mid_P=Mid_P2->next;
     free(Mid_P2);
     Mid_P2=Mid_P;    
  }    
  S->next=Mid_P2;
  return SUCCEED;

int StackLength(STACK *S) //返回栈中的元素个数 
{
    int len=0;
    STACK *M_S=S;
    while(M_S->next)
    {
     len++;
     M_S=M_S->next;
    }
    return len;
}

int Push(STACK *S,SDataType Data) //将Data压人栈中 
{
    
    STACK *Mid_P=(STACK *)malloc(sizeof(STACK));
    if(!Mid_P) return FAILURE;
    Mid_P->Data=Data;
    Mid_P->next=S->next;
    S->next=Mid_P;
    return SUCCEED;
}

int Pop(STACK *S,SDataType &Data)  //栈头数据弹出栈 
{
    if(!S->next) return FAILURE;
    STACK *Mid_P=S->next;
    S->next=Mid_P->next;
    Data=Mid_P->Data;
    free(Mid_P);
    return SUCCEED;
}

int GetTop(STACK *S,SDataType &Data) //获取栈头元素 
{
    if(!S->next) return FAILURE;
    Data=S->next->Data;
    return SUCCEED;
}
 

 

 

 

/*
顺序栈:顺序栈相比链式栈,顺序栈可以动态的增加栈的大小,但是不可以根据当前需要适当减少栈的空间,所以如果系统某一时段栈中的数据非常大
        但是这个时期很短,这个时候顺序栈将一直以最大的空间占用内存,造成内存浪费。
        但是顺序栈易于理解,而且不需要为每个栈元素申请一个指针节点。 
*/ 
#define FAILURE 0         //失败 
#define SUCCEED 1         //成功 
#define NO 0              //否 
#define YES 1             //是 
#define STACK_INIT_SIZE 100 //栈初始大小 
#define STACK_SIZE_INCREMENT 10 //增量大小 

/* 修改本条代码以自定义栈数据类型 (默认为char型)*/
typedef char SDataType;
/* 修改本条代码以自定义栈数据类型 (默认为char型)*/

typedef struct Stack //栈结构 
{
    SDataType *top;
    SDataType *base;
    int STACK_SIZE;
}STACK;

/*栈操作函数声明*/
int InitStack(Stack *S); //初始化栈 
int DestroyStack(STACK *S); //销毁栈 
int StackLength(STACK *S); //返回栈中当前元素数量
int ClearStack(STACK *S); //清空栈 
int Push(Stack *S,SDataType SData); //数据压栈 
int StackEmpty(Stack *S); //判断栈是否为空 
int Pop(Stack *S,SDataType &SData); //栈头数据弹出栈 
int GetTop(Stack *S,SDataType &SData); //获取栈头元素 
/*栈操作函数声明*/

int InitStack(STACK *S) //初始化栈 
{
      S->top=S->base=(SDataType *)malloc(STACK_INIT_SIZE*sizeof(SDataType));
    if(S->base==NULL) return FAILURE;
    S->STACK_SIZE=STACK_INIT_SIZE; 
      return SUCCEED; 

int DestroyStack(STACK *S) //销毁栈 
{
    free(S->base);
    return SUCCEED;
}
 
int StackLength(STACK *S) //返回栈中当前元素数量 
{
 return S->top-S->base;    

int ClearStack(STACK *S) //清空栈 
{
  S->top=S->base;
  return SUCCEED;    

int Push(STACK *S,SDataType SData) //数据压栈 
{
   if(S->top-S->base==S->STACK_SIZE)
   {
      SDataType *NewP=(SDataType *)realloc(S->base,(S->STACK_SIZE+STACK_SIZE_INCREMENT)*sizeof(SDataType));
      if(NewP==NULL) 
      return FAILURE;    
      S->base=NewP; 
      S->STACK_SIZE=S->STACK_SIZE+STACK_SIZE_INCREMENT;
   }    
   *S->top++=SData;
   return SUCCEED;

int StackEmpty(STACK *S) //判断栈是否为空 
{
    if(S->base==S->top)
    return YES;
    else
    return NO;
}

int Pop(Stack *S,SDataType &SData) //栈头数据弹出栈 
{
    if(StackEmpty(S)) return FAILURE;
    SData=*--S->top; return SUCCEED;
}

int GetTop(STACK *S,SDataType &SData) //获取栈头元素 
{
    if(StackEmpty(S)) return FAILURE;
    SData=*(S->top-1); return SUCCEED;

 

备注:第一次发文章,如果有错误和可以改进部分请大家提出,谢谢!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值