两个栈共享连续存储空间:它主要利用了栈底位置不变,栈顶位置动态变化的特性。
所以在定义栈顶指针时,需要定义两个栈顶指针。
双栈类型定义如下:
typedef struct
{ datatype data[MAXSIZE];
int top[2]; /* 栈顶指针 */
}DqStack;
两个共享栈的压栈算法:
int push(STACK *s,ElemType x,int k){//将x元素压入到以s为栈空间的第k个栈中
if(s->top[0]+1==s->top[1])
{
printf("\n stack is full!");
return 0;
}
if(k==0)
{
s->top[0]++;
s->data[s->top[0]]=x;
}
else
{
s->top[1]--;
s->data[s->top[1]]=x;
}
return 1;
}
两个共享栈的出栈算法:
int pop(STACK *s,int k,ElemType *x)//将以s为栈空间的第k个栈顶元素取出
{
if((k==0)&&(s->top[0]==-1))
{
printf("\n stack is free!");
}
if((k==1)&&(s->top[1]==Max))
{
printf("\n stack is free!");
}
if(k==0)
{
* x=s->data[s->top[0]];
s->top[0]--;
}
else
{
*x=s->data[s->top[1]];
s->top[1]++;
}
return 1;
}
取栈顶元素:
int stacktop(STACK *s,int k)//取栈顶元素
{
//ElemType x;
if(k==0)
{
if (s->top[0]==-1)
{ printf("栈空!\n");
return 0;
}
printf("栈顶数据为:%d\n",s->data[s->top[0]]);
return 1;
}
else
{
if (s->top[1]==Max)
{ printf("栈空!\n");
return 0;
}
//x=s->data[s->top[1]];
printf("栈顶数据为:%d\n",s->data[s->top[1]]);
return 1;
}
}
两栈共享连续存储空间,两个栈的栈底分别设在这个存储空间的两端的存储结构中,为了使两栈的空间能够做到互补余缺,减少溢出的可能性,两个栈的栈满溢出都不能按位置判别,仅当两栈的栈顶相遇时,才可能栈满溢出。代码最核心问题是在入栈,出栈时候判断栈满,栈空条件。
来源:CSDN
作者:渡✨
链接:https://blog.csdn.net/qq_44430829/article/details/104157909