スタックの入スタック、出スタック、拡張、長さ取得などの操作


stackを作成します.h
#pragma once
// :          ,           ,   
//   ,            ,            O(1)

#define INIT_SIZE 10

typedef struct SeqStack
{
 int *elem;//         ,       
 int top;//    ,           ,            
 int stacksize;//   
}SeqStack,*PSeqStack;

//   
void InitStack(PSeqStack ps);

//  
bool Push(PSeqStack ps,int val);

//  ,     ,       
bool Pop(PSeqStack ps,int *rtval);

//     ,    
bool GetTop(PSeqStack ps,int *rtval);

//  
bool IsEmpty(PSeqStack ps);

//    
int GetLength(PSeqStack ps);

//    
void Clear(PSeqStack ps);

//   
void Destory(PSeqStack ps);

stackを作成します.cpp
#include
#include
#include
#include"stack.h"
//  
static void DeterPointNull(PSeqStack ps)
{
 assert(ps!=NULL);
 if(ps==NULL)
 {
  exit(0);
 }
}

//   
void InitStack(PSeqStack ps)
{
 DeterPointNull(ps);
 ps->elem=(int *)malloc(INIT_SIZE*sizeof(int));
 ps->top=0;
 ps->stacksize=INIT_SIZE;
}

//  
static bool IsFull(PSeqStack ps)
{
 return ps->top==ps->stacksize;
}

//  
static void Inc(PSeqStack ps)
{
 ps->elem=(int *)realloc(ps->elem,ps->stacksize*2*sizeof(int));
}

//  
bool Push(PSeqStack ps,int val)
{
 DeterPointNull(ps);
 if(IsFull(ps))
 {
  Inc(ps);
 }
 
 ps->elem[ps->top++]=val;
 //ps->top++;
 
 return true;
}

//  ,     ,       
bool Pop(PSeqStack ps,int *rtval)//rtval:    :              
{
 DeterPointNull(ps);
 if(IsEmpty(ps))
 {
  return false;
 }
 *rtval=ps->elem[ps->top-1];
 ps->top--;
 
 return true;
}

//     ,    
bool GetTop(PSeqStack ps,int *rtval)
{
 DeterPointNull(ps);
 if(IsEmpty(ps))
 {
  return false;
 }
 *rtval=ps->elem[ps->top-1];
 return true;
}

//  
bool IsEmpty(PSeqStack ps)
{
 return ps->top==0;
}

//    
int GetLength(PSeqStack ps)
{
 DeterPointNull(ps);
 return ps->top;
}

//    
void Clear(PSeqStack ps)
{
 DeterPointNull(ps);
 ps->top=0;
}

//   
void Destory(PSeqStack ps)
{
 DeterPointNull(ps);
 free(ps->elem);//      
 ps->elem=NULL;//       
 ps->top=0;
 ps->stacksize=0;
 //ps=NULL;//   ,     ,         ,           
}