使用数组实现顺序栈,包含栈顶索引和容量信息:
typedef struct Stack
{
STDataType* _a;
int _top; // 栈顶
int _capacity; // 容量
}Stack;
栈的初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
入栈操作
当栈满或者容量为0时,先进行扩容,然后将数据压入栈顶:
void StackPush(Stack* ps, STDataType data)
{
assert(ps);
if (ps->_top == ps->_capacity)
{
int newcapacity = ps->_capacity == 0 ? 4 : 2 * ps->_capacity;
STDataType* p = (STDataType*)realloc(ps->_a,newcapacity * sizeof(STDataType));
if (p == NULL)
{
perror("StackPush()::realloc()");
return;
}
ps->_a = p;
ps->_capacity = newcapacity;
}
ps->_a[ps->_top] = data;
ps->_top++;
}
出栈操作
出栈只需将栈顶索引减一,无需删除数组中的原数据:
void StackPop(Stack* ps)
{
assert(ps);
assert(ps->_top > 0);
ps->_top--;
}
获取栈顶元素
返回栈顶元素的值,但不修改栈:
STDataType StackTop(Stack* ps)
{
assert(ps);
assert(ps->_top > 0);
return ps->_a[ps->_top-1];
}
获取栈中有效元素个数
int StackSize(Stack* ps)
{
assert(ps);
return ps->_top;
}
检测栈是否为空,如果为空返回非零结果,如果不为空返回0
int StackEmpty(Stack* ps)
{
return ps->_top == 0;
}
// 销毁栈
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->_a);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
361

被折叠的 条评论
为什么被折叠?



