目录
堆栈—概述
堆栈是一种线性存储形式,通常由一个一维数组构成。栈的顺序存储通常由一个一维数组和一个记录栈顶的位置变量组成。在这里一维数组代表栈内元素,top代表栈顶元素位置。
注意:top=-1的时候代表空栈,top=0代表栈内有一个元素。
在这里,我爱将两种堆栈:一种是线性堆栈,一种是双向堆栈。
(我们可以把堆栈形象的比喻为一个羽毛球筒,羽毛球只能一个一个装进去,再一个一个按顺序拿出来。)
对线性堆栈进行操作
入栈:
检验知否堆栈满,如果没满就把元素堆入栈,top值+1。
void Push(Stack PtrS,ElementType item)
{
if(PtrS->Top==MaxSize-1)
{
printf("栈堆满");
return;
}
else
{
PtrS->Data[++(PtrS->Top)]=item;
return;
}
}
出栈:
检验是否堆栈空,如果没空,就将元素出栈,top值-1。
ElementType Pop(Strack PtrS)
{
if(PtrS->Top==-1)
{
printf("堆栈空");
return ERROR;
}
else
{
return(PtrS->Data[++(PtrS->Top)--]);
}
}
双向堆栈
因为我们利用一维数组存储堆栈,而一维数组有一个小弊端:必须在定义的时候就知道元素数量。所以有时候可能会存在浪费空间的问题。
现在我们采取一个新的存储方式:双向存储。即数组的两端都是Top,从两侧向中间填充。这样就能很大程度地避免浪费空间的问题。(如下图)
对双向堆栈进行操作
入栈
先判断堆栈满了没。如果没满,要往第一个堆栈里添加元素,就top1++。要往第二个堆栈添加元素就top2--。
void Push(struct DStack *PtrS,ElementType item,int Tag)
{
if(PtrS->Top2-PtrS->Top1==1)
{
printf("栈堆满");
return;
}
if(Top==1)
{
PtrS->Data[++(PtrS->Top1)]=item;
else
PtrS->Data[--(PtrS->Top1)]=item;
}
出栈
先判断是否空栈。再分别进行操作。
ElementType Pop(struct DStack *PtrS,int Top)
{
if(Tag==1)
{
if(PtrS->Top1==-1)
{
printf("堆栈1空");
return NULL;
}
else return PtrS->Data[--(PtrS->Top1)];
}
else
{
if(PtrS->Top2==MaxSize)
{
printf("堆栈2空");
return NULL;
}
else return PtrS->Data[--(PtrS->Top1)];
}
}
有问题欢迎补充/指正
就酱,拜拜~