厨房里叠放的盘子,新洗好的只能放在最顶层,使用时也必须从最上层开始取;羽毛球桶里的球也是如此。这种'后进先出'的日常规则,恰好就是栈这种数据结构的直觉来源。
栈(stack)是一种操作受限的线性表,只允许在一端(称为栈顶)进行插入和删除。最晚入栈的元素最先出栈,最早入栈的元素最后才能出来。为了描述方便,我们把最底层的固定元素叫栈底,没有任何元素的栈叫空栈。

下面我们用C语言亲手实现一个动态数组栈。先用结构体定义栈骨架:
typedef int STDatatype;
typedef struct Stack {
STDatatype* a; // 指向动态数组的指针
int top; // 栈顶标记,指向栈顶元素的下一个位置
int capacity; // 数组容量
} Stack;
把int重命名为STDatatype是为了将来能一键切换存储类型。top的设计很关键:空栈时top=0,入栈一个元素后top=1,栈顶元素实际是a[top-1]。这种方案让空栈判断和容量计算都很简洁。
接口定义如图所示,覆盖了栈的最小操作集:

文件组织上,我把声明放在 Stack.h,实现放在 Stack.c,测试放在 Test.c。

头文件声明了这些接口:
void StackInit(Stack* pst);
void StackDestroy(Stack* pst);
void Push(Stack* pst, STDatatype x);
void ;
STDatatype ;
;
;




