栈好像就是一叠盘子,盘子只能从最上面拿,不可以从中间或者下面。满足后进先出。
栈可以使用顺序表实现,也可以使用链表实现。
栈的重点主要是出栈和入栈
若使用顺序表实现栈,则左边为栈底,右边为栈顶(栈顶出元素)
若使用链表实现栈,头做栈顶,头插头删,可以设计为单链表。尾做栈顶,尾插尾删,设计为双向链表(否则删除数据效率低)
1.栈结构体的声明
typedef strcut Stack{
DataType* data;
size_t size;
size_t capacity;
}Stack;
2.栈的初始化
void StackInit(Stack* ps)
{
assert(ps);
ps->data = NULL;
ps->size = 0;
ps->capacity = 0;
}
3.栈的销毁
void StackDestroy(Stack* ps)
{
assert(ps);
free(ps->data);
ps->data = NULL;
ps->size = ps->capacity = 0;
}
4.栈的扩容
void AddStack(Stack* ps)
{
if(ps->capacity == ps->size)
{
int new_capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//扩容两倍
}
StackDataType* tmp = realloc(ps->data, sizeof(DataType) * new_capacity);
if(tmp == NULL)
{
printf("realloc fail\n");
exit(-1);
}
ps->data = tmp;
ps->capacity = new_capacity;
}
5.入栈
void StackPush(Stack* ps, DataType x)
{
assert(ps);
AddStack(Stack* ps);
ps->data[ps->size] = x;
ps->size++;
}
6.出栈
DataType StackPop(Stack* ps)
{
assert(ps);
return ps->data[--ps->size];
}