栈的定义:栈(stack)是限定仅在表尾进行插入或删除操作的线性表因此,对栈来说,表尾端有其特殊意义,称为栈顶(top),相应的,表头端称为栈底(bottom)。不含元素的空表称为空栈。
栈的特点:先进后出(后进先出)
栈的基本操作:
InitStack(&S)//构造一个空栈
DestroyStack(&S)//栈S存在的情况下销毁栈S
ClearStack(&S)//栈S存在的情况下将栈S清为空栈
StackEmpty(S)//若栈S存在判断S是否为空栈,若S为空栈,则返回TRUE,否则返回FALSE
StackLength(S)//若栈S存在返回S的元素个数,即栈的长度
GetTop(S,&e)//若S存在且非空把S的栈顶元素赋给e的地址,用e返回栈顶元素
Push(&S,e)//若栈S存在插入元素e为新的栈顶元素
Pop(&S,&e)//若栈S存在且非空删除栈S的栈顶元素并赋值给e的地址。用e返回栈顶元素
StackTraverse(S,visit())//从栈底到栈顶依次对栈S的每个数据元素调用函数visit()一旦visit()失败,则操作失败
顺序栈
顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈顶元素在顺序栈中的位置。
先为栈分配一个基本容量,然后在应用过程中,当栈的空间不够使用时再逐段扩大。顺序栈的内存中的形式类似于数组,在内存中占连续的一段存储空间。
#define STACK_INIT_SIZE 100 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配量
typedef struct{
SElemType *base;//栈底指针(在栈构造之前和销毁之后,base的值为NULL)
SElemType *top;//栈顶指针
int stacksize;//表示栈当前可使用的最大容量
}SqStack;
//-----基本操作的算法描述-----
Status InitStack(SqStack &S)
//构造一个空栈S
{
S.base = (SElemType *)malloc(STACK_INTI_SIZE * sizeof(SElemType));
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
Status DestroyStack(SqStack &S)
//销毁栈S
{
if(!S.base) exit(OVERFLOW); //判断栈是否存在
free(S.base);
S.base = NULL;
S.top = NULL;
S.size = o;
return OK;
}
Status ClearStack(SqStack &S)
//把栈S置为空栈
{
if(!S.base) exit(OVERFLOW)