目录
一、栈的原理
二、栈的实现
1.栈的定义
2.栈的初始化
3.入栈
4.出栈
5.获取栈顶元素
6.栈的大小
7.判断栈是否为空
8.栈的销毁
一、栈的原理
堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。
常与另一种有序的线性资料集合队列相提并论。
堆栈常用一维数组或链表来实现。
堆栈(英语:stack)又称为栈或堆叠,是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合的一端(称为堆栈顶端,英语:top)进行加入数据(英语:push)和移除数据(英语:pop)的运算。因而按照后进先出(LIFO, Last In First Out)的原理运作。
常与另一种有序的线性资料集合队列相提并论。
堆栈常用一维数组或链表来实现。
栈有一个比较特别的性质,Last In First Out(后进先出)
压栈:栈的插入操作叫做进栈 / 压栈 / 入栈, 入数据在栈顶 。 出栈:栈的删除操作叫做出栈。 出数据也在栈顶 。我们会发现栈这种数据结构只能从一侧入数据,从另一侧出数据
这种特殊的性质决定了只能在栈顶入数据,同时栈没有打印接口,栈不能遍历
我们如果要遍历栈就会打乱栈的顺序
栈可以用来将递归改为非递归
因为如果递归深度过深就会出现栈溢出,所以我们可以用栈将递归改为迭代
二、栈的实现
在实现栈之前,我们要想我们可以用什么来模拟栈呢?
栈的实现一般可以使用数组或者链表来实现,相对而言用数组来模拟实现更优一点
因为数组在尾上插入数据的代价比较小
1.栈的定义
栈,我们用数组来实现,所以在栈的定义时需要定义一个指针来指向栈,同时用下标来访问
,同时还需要栈的容量
typedef int STDataType;
typedef struct Stack
{
STDataType* a;
int top;
int capacity;
}ST;
2.栈的初始化
我们初始化时,要将容量与栈顶置为空,指向栈的指针置为NULL
void StackInit(ST* ps)
{
assert(ps);
ps->a = NULL;
ps->capacity = ps->top = 0;
}
3.入栈
入栈,我们就需要先判断容量,然后再插入元素
同时让栈顶指针向后走
void StackPush(ST* ps, STDataType x)
{
assert(ps);
if (ps->capacity == ps->top)
{
int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
STDataType* tmp = (STDataType*)realloc(ps->a, sizeof(STDataType) * newCapacity);
if (tmp == NULL)
{
printf("realloc errorn");
exit(-1);
}
ps->a = tmp;
ps->capacity = newCapacity;
}
ps->a[ps->top] = x;
ps->top++;
}
4.出栈
需要先判断栈是否为空
出栈就把栈top减减就可以了
void StackPop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
ps->top--;
}
5.获取栈顶元素
top指向的元素减1就是栈顶元素
STDataType StackTop(ST* ps)
{
assert(ps);
assert(!StackEmpty(ps));
return ps->a[ps->top-1];
}
6.栈的大小
top就是栈的大小
int StackSize(ST* ps)
{
assert(ps);
return ps->top;
}
7.判断栈是否为空
bool StackEmpty(ST* ps)
{
assert(ps);
return ps->top == 0;
}
8.栈的销毁
void StackDestroy(ST* ps)
{
assert(ps);
free(ps->a);
ps->capacity = ps->top = 0;
ps->a = NULL;
}



