1.栈的概念及结构
2.栈的实现
所以我们创建一个栈的结构体:
typedef int STDataType; //定义数据类型,方便不同数据类型使用;
typedef struct Stack
{
STDataType* a; //创建一个数据类型指针,支持动态增长的栈
int top; // 栈顶
int capacity; // 容量
}Stack;
2.1初始化栈
void StackInit(Stack* ps)
{
assert(ps);ps->a = NULL;
ps->capacity = 0; //表示栈的容量;
ps->top = 0; // 表示top指向栈顶元素的下一个位置
}
2.2 入栈
void StackPush(Stack* pst, STDataType data)
{
assert(pst);if (pst->top == pst->capacity) //这里要先判断一下栈的容量,空间足够插入,
{ //空间不足,就进行扩容;
int newcapacity = pst->capacity == 0 ? 4 : pst->capacity * 2;
STDataType* tmp = (STDataType*)realloc(pst->a, sizeof(STDataType) * newcapacity);
if (tmp == NULL) //判断一下是否扩容成功!
{
perror("realloc fail");
return;
}pst->a = tmp; //扩容成功后把tmp的地址给pst->a
pst->capacity = newcapacity; //扩容成功后别忘了capacity的值也更改一下
}pst->a[pst->top] = data; //把数据data入栈
pst->top++; //数据插入成功,把下标往后挪1位置
}
2.3出栈
// 栈的定义是后进先出 ,
// 出栈的话,只需要把top- - 就好,下次有数据插入会直接覆盖;
void StackPop(Stack* pst)
{
assert(pst); // 不为空
assert(pst->top > 0); //当top<0的时候,说明该栈已经没有任何数据,pst->top--; //所以也就出不了栈,
}
2.4获取栈顶元素
STDataType StackTop(Stack* pst)
{
assert(pst); // 不为空
assert(pst->top > 0);return pst->a[pst->top - 1]; //注意top的位置,不要搞混!
}
2.5 获取栈中有效元素个数
int StackSize(Stack* pst)
{
assert(pst);return pst->top; //直接返回top的值就行;
}
2.6检测栈是否为空,如果为空返回非零结果,如果不为空返回0
bool STEmpty(Stack * pst)
{
assert(pst);return pst->top == 0; //当top==0的时候,说明栈为空,返回true;
} //反正返回flase;
2.7 销毁栈
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->a); //把a指针开辟的空间给free,就可以了
ps->a = NULL; //顺便把a的指针置空
ps->capacity = ps->top = 0; //top与capacity别忘了也置0噢。
}