#include "iostream"
using namespace std;
#define STACK_INIT_SIZE 5 //存储空间初试分配量
#define STACKINCREAMENT 10 //存储空间分配增量
//当分配空间地址有MAXLEN个的时候,
//内存空间范围为[0,MAXLEN-1];
//使得base = 0,top = MAXLEN-1;
//初始化top = base = 0
//因为在Push的操作中,每次完了之后都是使得top++;
//如果top==MAXLEN-1的时候,完成之后就会执行top++,这个时候其实top已经在预分配内存之外了
//所以才有了下一步(top-base>=base),从而实现了动态分配
//a)非空栈 top>=1,栈顶元素=s[top-1]
//b)进出栈说明:
// 进栈:现将数据放入top的位置,然后top++
// 出栈:先top--,然后在取出元素
//c)满栈条件 top == MAXLEN,若此时插入元素则会溢出
//d)空栈条件 top == base ==0 ,若此时删除元素,将会发生下溢
typedef struct {
int *base;//栈底指针
int *top;//栈顶指针,栈顶永远处于比数据高的一个位置
int stacksize;
}SqStack;
void InitStack(SqStack &S);
void Push(SqStack &S,int element);
void Pop(SqStack &S);
void main()
{
SqStack S;
InitStack(S);
for (int i = 0;i<10;i++)
{
Push(S,i);
}
Pop(S);
}
void InitStack(SqStack &S){
S.base = (int *)malloc(STACK_INIT_SIZE*sizeof(int));
if (!S.base)
{
exit(0);//分配内存失败,程序退出
}
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
void Push(SqStack &S,int element){
if (S.top-S.base>=S.stacksize)//判断是否栈溢出
{
S.base = (int *)realloc(S.base,(S.stacksize+STACKINCREAMENT)*sizeof(int));
if (!S.base)
{
exit(0);//分配内存失败,程序退出
}
S.top = S.base+S.stacksize;
S.stacksize+=STACKINCREAMENT;
}
*S.top++ = element;
}
void Pop(SqStack &S){
//当栈顶和栈底相同时,若删除原始,将会发生“下溢”
if (S.top==S.base)
{
exit(0);
}
int element = *--S.top;
cout<<element<<endl;
}