スタックテンプレート


#include <iostream>
#include <cstdio>
#include <malloc.h>
using namespace std;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
#define OVERFLOW 0
#define TRUE 1
#define FALSE 0
#define ERROR 0
#define OK 1
typedef int Status;
typedef  int SElemType;
struct SqStack
{
    SElemType *base;   //           ,base=NULL
    SElemType  *top;     //    
    int stacksize;     //         
};
//S.top=     ,*S.top=     
void InitStack(SqStack &S);
void DestroyStack(SqStack &S);
void ClearStack(SqStack &S);
Status StackEmpty(SqStack &S);
int StackLength(SqStack S);
Status GetTop(SqStack S,SElemType &e);//    , e      ,   OK
void Push(SqStack &S,SElemType e);  //    e      ,
Status Pop(SqStack &S,SElemType &e);  //  S  ,   S     , e    ,    OK
void StackTraverse(SqStack S);

void InitStack(SqStack &S)
{
    S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    if(!S.base)
        exit(OVERFLOW);//          ,  
    S.top=S.base;    //      (  )
    S.stacksize=STACK_INIT_SIZE;  //          
}

void DestroyStack(SqStack &S)
{
    free(S.base); //      
    S.top=S.base=NULL;  //  ,       
    S.stacksize=0;  //            
}
void ClearStack(SqStack &S)
{
    S.top=S.base;
}
Status StackEmpty(SqStack &S)
{
    if(S.top==S.base)  //  
     return TRUE;
    else
      return FALSE;
}
int StackLength(SqStack S)
{
    return S.top-S.base;
}
Status GetTop(SqStack S,SElemType &e)//    , e      ,   OK
{
    if(S.top>S.base)
    {
        e=*(S.top-1);  //       e
        return OK;
    }
    else
        return ERROR;
}
void Push(SqStack &S,SElemType e)  //    e      ,
{
    if(S.top-S.base==S.stacksize)//  
    {
        S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
        if(!S.base) //        
           {
               exit(OVERFLOW);
           }
        S.top=S.base+S.stacksize;
        S.stacksize+=STACK_INCREMENT;
    }
    *(S.top)++=e;  // e  ,        ,            

}
Status Pop(SqStack &S,SElemType &e)  //  S  ,   S     , e    ,    OK
{
    if(S.top==S.base)
        return ERROR;
    e=*--S.top;
    return OK;
}
void StackTraverse(SqStack S)
{
    SElemType *p=S.base;
    while(S.top>p)
    {
        printf("%d  ",*p++);  //*p  *S.base           ,S.base    
    }
    printf("
"); } int main() { int j; SqStack s; SElemType e; InitStack(s); for(j=1;j<=12;j++) Push(s,j); // j printf(" :"); StackTraverse(s); Pop(s,e);// , e printf(" :%d
",e); printf(" ?%d (1:Yes 0:No)
",StackEmpty(s)); GetTop(s,e); // e printf(" %d, %d
",e,StackLength(s)); ClearStack(s);// printf(" ?%d(1:Yes 0:NO)
",StackEmpty(s)); DestroyStack(s); printf(" ?%d(1:Yes 0:NO)
",StackEmpty(s)); return 0; }// S.base S.top *S.base *S.top