スタックの入スタック、出スタック、拡張、長さ取得などの操作
15748 ワード
stackを作成します.h
stackを作成します.cpp
#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;// , , ,
}