栈是一种对数据的存储方式,栈对数据要求后进先出,但是栈并不规定使用顺序表还是链表作为实现的方式,根据栈后进先出的特性,我们使用顺序表来实现会比较方便一些。接下来我们就来写一个栈。
要写一个栈首先要创建一个栈,我们从使用场景来看的话我们对于栈顶元素的调用会很频繁,所以我们要用顺序表来实现的同时应当有一个标记来记录栈顶元素的下标。
typedef int datatype;
typedef struct stack
{
datatype* data;
int top;
int capacity;
}stack;
对于栈的应用方面,通常只是对数据的存储和调用,或者是对栈顶元素的调用,几乎不存在对某个特定元素的查找或者修改。所以我们就通过添加元素和删除元素的接口来学习栈。
一、增
因为栈要符合后进先出的特性,所以我们的栈没有头插一说。我们只需要在创建的数组后面进行尾插就可以了。
void stackpush(stack* p, datatype x)
{
if (p->top == p->capacity)
{
p->capacity = p->capacity == 0 ? 4 : 2 * p->capacity;
p->data = realloc(p->data, p->capacity * sizeof(datatype));
}
p->data[p->top] = x;
p->top++;
}
二、删
由于栈的底层我们是通过顺序表来实现的,所以我们只需要通过修改栈顶元素的下标来让我们的栈无法调用到栈顶元素就可以了。
void stackpop(stack* p)
{
assert(p);
assert(p->top > 0);
p->top--;
}
三、获取栈顶元素
获取栈顶元素就是字面意思,因为我们在创建栈的数据结构时候就已经给栈顶元素提前保留了一个下标来访问,所以我们可以直接使用这个下标来访问到栈顶元素再把栈顶元素作为返回值返回给函数外部即可。
datatype stacktop(stack* p)
{
assert(p);
assert(p->top > 0);
return p->data[p->top - 1];
}