栈(stack)是一种只能在一端进行插入和删除操作的线性表。这一端叫栈顶(top),另一端叫栈底(bottom)。不含任何元素的栈称为空栈。栈的插入操作通常叫入栈或压栈,删除操作叫出栈或弹栈。栈总是遵循后进先出(LIFO)的原则。

栈本质上还是线性表,所以上一章介绍的顺序存储和链式存储方式对栈同样适用。对栈的常见操作包括:
- InitStack(*s):初始化一个空栈。
- DestroyStack(*s):销毁栈。
- ClearStack(*s):清空栈。
- StackEmpty(s):若栈为空返回true,否则返回false。
- GetTop(s, *e):栈非空时,用e返回栈顶元素。
- Push(*s, e):入栈新元素e。
- Pop(*s, *e):出栈栈顶元素,并用e返回其值。
- StackLength(s):返回栈的当前元素个数。
下面重点看顺序存储的实现。
顺序栈的数据结构
顺序栈用一个数组存储元素,再用一个整型变量top指示栈顶位置。定义如下:
typedef int SElemType; // 元素类型,这里假设为int
typedef struct {
SElemType data[MAXSIZE];
int top; // 栈顶指针
} SqStack;
初始化时,将top设为-1表示空栈。
基本操作的实现
构造空栈
Status InitStack(SqStack *s) {
s->data = (SElemType *)malloc(MAXSIZE * sizeof(SElemType));
s->top = -1;
return OK;
}
清空栈
Status ClearStack(SqStack *s) {
s->top = -1;
return OK;
}
判空
Status StackEmpty(SqStack s) {
return s.top == -1;
}
求长度
{
s.top + ;
}



