在计算机科学中,栈这种抽象数据类型是十分重要的,其基本运作原理可简化为四个字“后进先出”。如下图
而栈在描述函数调用的时候是非常好用的,当前环境一般由栈顶函数进行描述,当函数返回后,执行出栈操作,回到前一级调用该函数的函数,这样逐步递归到主函数。
栈的链表实现通常为尾删尾增的形式。但栈的数组实现更为简单,且更为常用,接下来就来进行栈的数组实现。
首先构思,为了实现栈我们首先需要能够存储数据的内存来当作栈,这件事情就可以交给数组来搞定,数组交给指针来维护,同时还得有一个记录栈的最大空间的capacity。最后,我们需要有一个数据来记录栈内元素的个数。这样一来,栈顶就可以通过这个记录元素个数的数据来访问了。栈就需要一个结构体来实现了。
栈的结构体声明:
struct Stack;
typedef struct Stack* PtrStack;
struct Stack
{
int* arr;
int size;
int capacity;
};
创建一个栈:
通过主调函数给的值来创建相应大小的栈
PtrStack CreatingStack(int maxnum)
{
PtrStack S = (PtrStack)malloc(sizeof(Stack));
assert(S);
S->arr = (int*)malloc(sizeof(int) * maxnum);
assert(S->arr);
S->capacity = maxnum;
S->size = 0;
return S;
}
进栈操作:
void PushStack(PtrStack S, int value)
{
assert(!(S->size >= S->capacity));
S->arr[S->size] = value;
S->size++;
}
出栈操作:
void PushStack(PtrStack S, int value)
{
assert(!(S->size >= S->capacity));
S->arr[S->size] = value;
S->size++;
}