栈
1.概念:
栈简单的说就是“先进后出”的数据结构,就相当于几辆汽车进入了一个只允许一辆车通行的死胡同,先进去的车辆只能等最后进去的车辆出来后才能出来。
2.栈的定义:
栈是仅在表尾进行插入或删除操作的线性表。表尾端具有其特殊的含义,称为栈顶,表头端称为栈底,不含元素的空表称为空栈
3.顺序栈的定义:
typedef struct{
SElemType *base; //定义栈底指针
SElemType *top; //定义栈顶指针
int stacksize; //定义占空间大小
}SqStack;
由上图,base指针是一直不动的,但是栈顶随着进栈和出栈的操作而变化,每次top指针指向栈顶数组的下一个存储位置。
当top==base时,栈为空
4.关于栈的一些基本操作:
(1). 初始化栈算法:
void InitStack(SqStack &S)
{
S.base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); //使用malloc函数得到了所需要的空间大小
if(!S.base) exit(OVERFLOW); //存储分配失败
S.top=S.base;
S.stack = STACK_INIT_SIZE; //对栈的尺寸大小进行初始化
}
(2)进栈操作:
首先要判断栈是否存在溢出,若溢出,则通过realloc函数进行追加储存空间,再一次进行分配,此时top和base指针也发生了变化。
然后进行入栈
void Push(Sqstack &S, ElemType e)
{
if(S.top - S.base >= S.stacksize)
{
S.base=(ElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(ElEMTYPE));
if(!S.base)
exit(OVERFLOW);
S.top = S.base + S,stacksize;
S.stacksize += STACK_INCREMENT;
}
*(S.top)++ = e ;
}
(3) 出栈操作:
首先要判断栈是否为空,若为空,返回ERROR。
然后通过top指针取出栈顶元素,但是此时top指针并没有发生变化
Status GetTop(SqStack S, ElemType &e)
{
if(S.top>S.base)
{
e = *(S.top-1);
return OK;
}
else
{
return ERROR;
}
}
(4).判断栈内是否为空:
Status Stack(SqStack S)
{
if(S.top==S.base)
{
return TRUE;
}
else
{
return FALSE;
}
}
(5)销毁栈算法:
利用free释放栈后,还要将top指针,base指针和栈的长度归为空
void DestotyStack(Sqstack &S)
{
free(S.base); //首先释放此空间
S.base = NULL; //令base,top, stacksize指向空
S.top = NULL;
S.stacksize = 0;
}