栈的基本操作(附带一个数据结构、C语言版)

本文详细介绍了栈这一数据结构的基本操作,并提供了C语言实现的示例代码,包括入栈、出栈、查看栈顶元素等核心功能。
摘要由CSDN通过智能技术生成
/******************************************************
Description  :This File Tell U How To Use Stack
History      :
Date         :2017/7/7
Author       :wangzai
Modification :
******************************************************/
#include <stdio.h>
#include <malloc.h>
#include <string.h>

#define STACK_INIT_SIZE  10
#define STACKINCREMENT   10
#define STRLEN           20
#define OK               0
#define ERROR            -1

typedef struct selemtype
{
  int  value;
  char cStr[STRLEN];
}SElemType;

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

/******************************************************
Description  :Init a Stack
Input        :SqStack *S
OutPut       :None
Return Value :OK/ERROR(0/-1)
Calls        :
Call By      :
******************************************************/
int InitStack(SqStack *S)
{
  S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
  if(!S->base)
  {
    printf("Malloc Failed\n");
    return ERROR;
  }
  S->top = S->base;
  S->stacksize = STACK_INIT_SIZE;
  return OK;
}


/******************************************************
Description  :Get Stack Top ElemType
Input        :SqStack *S
              SElemType **e
OutPut       :None
Return Value :OK/ERROR(0/-1)
Calls        :
Call By      :
******************************************************/
int GetTop(SqStack * S,SElemType **e)
{
  if(S->base == S->top)
  {
    printf("\n Empty Stack\n");
    return ERROR;
  }
  *e = S->top-1;
  return OK;
}

/******************************************************
Description  :Push a Element In The Stack
Input        :SqStack *S
              SElemType e
OutPut       :None
Return Value :OK/ERROR(0/-1)
Calls        :
Call By      :
******************************************************/
int Push(SqStack *S,SElemType e)
{
  if(S->top - S->base >= S->stacksize)
  {
    S->base = (SElemType *)realloc(S->base,(S->stacksize + STACKINCREMENT)*sizeof(SElemType));
    if(!S->base)
    {
      printf("\n Realloc Fail\n");
      return ERROR;
    }
    S->top = S->base + S->stacksize;
    S->stacksize += STACKINCREMENT;
  }
  *S->top++ = e;
  return OK;
}

/******************************************************
Description  :check Stack is Empty
Input        :SqStack *S
OutPut       :None
Return Value :OK/ERROR(0/-1)
Calls        :
Call By      :
******************************************************/
int IsEmpty(SqStack *S)
{
  if(S->top == S->base)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}

/******************************************************
Description  :Pop a Element From The Stack
Input        :SqStack *S
              SElemType **e
OutPut       :None
Return Value :OK/ERROR(0/-1)
Calls        :
Call By      :
******************************************************/
int Pop(SqStack *S,SElemType **e)
{
  if(S->top == S->base)
  {
    printf("\n Empty Stack \n");
    return ERROR;
  }
  *e = --S->top;
  
  return OK;
}

/******************************************************
Description  :Clear The Stack
Input        :SqStack *S
OutPut       :None
Return Value :
Calls        :
Call By      :
******************************************************/
void ClearStack(SqStack *S)
{
  S->top = S->base;
  return;
}

/******************************************************
Description  :Destroy The Stack
Input        :SqStack *S
OutPut       :None
Return Value :
Calls        :
Call By      :
******************************************************/
void DestroyStack(SqStack *S)
{
  printf("Destroy The Stack \n");
  free(S->base);
  S->base = NULL;
  S->top  = NULL;
  S->stacksize = 0;
  return;
}
int main()
{
  SqStack ST   = {0};
  SqStack *pST = &ST;
  
  SElemType stElem = {0};
  SElemType *getTopElem = (SElemType *)malloc(sizeof(SElemType));

  char strDemo[] = "Hello  BAT";
  int  Ret       = 0;
  int  index     = 0;
  char Store[] = "[(){}]";
  Ret = InitStack(pST);
  
  for(index=0;index<STACK_INIT_SIZE;index++)
  {
    stElem.value = index;
    strcpy(stElem.cStr,strDemo);
    Ret = Push(pST,stElem);
  }

  while(!Pop(pST,&getTopElem))
  {
    printf("Stack pop %s and %d \n",getTopElem->cStr,getTopElem->value);
  }
  DestroyStack(pST);
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值