// 支持动态增长的栈
typedef int STDataType;
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
// 初始化栈
void StackInit(Stack* ps);
// 入栈
void StackPush(Stack* ps, STDataType data);
// 出栈
void StackPop(Stack* ps);
// 获取栈顶元素
STDataType StackTop(Stack* ps);
// 获取栈中有效元素个数
int StackSize(Stack* ps);
// 检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps);
// 销毁栈
void StackDestroy(Stack* ps);
#include"Stack.h"
void CheckCapacity(Stack* ps)
{
if (ps->_capacity == ps->_size)
{
ps->_capacity *= 2;
ps->_a = (STDataType *)realloc(ps->_a, ps->_capacity * sizeof(STDataType));
}
}
void StackInit(Stack* ps)
{
ps->_a = (STDataType*)calloc(DEFSTACKSIZE, sizeof(STDataType));
ps->_capacity = DEFSTACKSIZE;
ps->_size = 0;
}
void StackPush(Stack* ps, STDataType data)
{
CheckCapacity(ps);
ps->_a[ps->_size] = data;
ps->_size++;
}
void StackPop(Stack* ps)
{
if (ps->_size == 0)
{
return;
}
ps->_size--;
}
STDataType StackTop(Stack* ps)
{
if (ps->_size == 0)
{
return (STDataType)0;
}
return ps->_a[ps->_size - 1];
}
int StackSize(Stack* ps)
{
return ps->_size;
}
int StackEmpty(Stack* ps)
{
return ps->_size == 0;
}
void StackDestroy(Stack* ps)
{
if (ps->_a)
{
free(ps->_a);
ps->_a = NULL;
ps->_size = 0;
ps->_capacity = 0;
}
}
void StackPrintf(Stack* ps)
{
if (ps->_size == 0)
{
return;
}
for (int i = 0; i < ps->_size; ++i)
{
printf("%d ", ps->_a[i]);
}
printf("\n");
}