小白养成记数据结构系列(10)——栈的理论知识

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;
 }
发布了17 篇原创文章 · 获赞 19 · 访问量 617

猜你喜欢

转载自blog.csdn.net/So_cute_SJM/article/details/103879557
今日推荐