#include<stdio.h>
#include<stdlib.h>
//约定:top指向栈顶元素的下一个位置
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 1
//严蔚敏版数据结构给的OK 和 Error
//OK 1 不OK(Error) 0
#define OK 1
#define ERROR 0
typedef struct
{
int* base;
int* top;
int stacksize; //当前已分配的存储空间
}SqStack;
int InitStack(SqStack* S)
{
S->base = (int*)malloc(STACK_INIT_SIZE * sizeof(int));
if (!S->base)
{
exit(-1);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
return OK;
}
int Push(SqStack* S, int e)
{
if (S->top - S->base >= S->stacksize) //栈满,追加存储空间
{
S->base = (int*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(int));
//realloc 重新分配内存空间 realloc() 函数用来重新分配内存空间,其原型为: void* realloc (void* ptr, size_t size);
if (!S->base) {
exit(-1);
}
S->top = S->base + S->stacksize;
S->stacksize += STACKINCREMENT;
}
*(S->top) = e;
S->top++;
return OK;
}
int Pop(SqStack* S, int& e)
{
//若栈不空,则删除S的栈顶元素
//用e返回其值,并返回OK
//否则返回ERROR
if (S->top == S->base)
{
return ERROR;
}
e = *(--S->top);
return OK;
}
int Top(SqStack* S, int& e)
{
//若栈不空,则返回S的栈顶元素
//用e返回其值,并返回OK
//否则返回ERROR
if (S->top == S->base)
{
return ERROR;
}
e = *(S->top-1);
return OK;
}
int main()
{
SqStack S;
InitStack(&S);
int e;
Push(&S, 1);
Push(&S, 2);
Push(&S, 3);
Pop(&S, e);
printf("%d\n", e);
Top(&S, e);
printf("%d\n", e);
return 0;
}