1 栈
1.1 栈的定义
栈是一种重要的线性结构,是线性表的一种具体形式。
栈(Stack)是一个后进先出(Last in first out,LIFO)的线性表,它要求只在表尾进行删除和插入操作。
表尾称为栈的栈顶(top),表头称为栈底(bottom)。
栈的插入操作(Push),叫做进栈,也称为压栈,入栈。栈的删除操作(Pop),叫做出栈,也称为弹栈。
因为栈的本质是一个线性表,线性表有两种存储形式,那么栈也有分为栈的顺序存储结构和栈的链式存储结构。
1.2 栈的顺序存储结构
最开始栈中不含有任何数据,叫做空栈,此时栈顶就是栈底。然后数据从栈顶进入,栈顶栈底分离,整个栈的当前容量变大。数据出栈时从栈顶弹出,栈顶下移,整个栈的当前容量变小。
定义
typedef struct
{
ElemType *base;
ElemType *top;
int stackSize;
}sqStack;
//定义了一个顺序存储的栈,它包含了三个元素:base,top,stackSize。
//其中base是指向栈底的指针变量,top是指向栈顶的指针变量,stackSize指示栈的当前可使用的最大容量。
- 创建
#define STACK_INIT_SIZE 100
initStack(sqStack *s)
{
s->base = (ElemType *)malloc( STACK_INIT_SIZE * sizeof(ElemType) );
if( !s->base )
exit(0);
s->top = s->base; // 最开始,栈顶就是栈底
s->stackSize = STACK_INIT_SIZE;
}
- 入栈:要在栈顶进行,每次向栈中压入一个数据,top指针就要+1,到栈满为止。
#define SATCKINCREMENT 10
Push(sqStack *s, ElemType e)
{
// 如果栈满,追加空间
if( s->top – s->base >= s->stackSize )
{
s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
if( !s->base )
exit(0);
s->top = s->base + s->stackSize; // 设置栈顶
s->stackSize = s->stackSize