前言
栈的应用非常广泛,经常出现 一个程序需要同时使用多个栈的情况。使用顺序栈会由于栈大小难以准确估计,从而造成有的栈溢出,有的栈空闲。为了解决这个问题,可以让多个栈共享一个足够大的连续存储空间,通过利用栈的动态特性使多个栈的存储空间能够互相补充,存储空间得到有效利用,这就是共享栈。
在栈的共享问题中,最常用的是两个栈的共享。共享栈主要利用栈顶固定,栈顶迎面增长的方式。实现方法是两个栈共享一个一维数组空间,两个栈的栈顶设在数组的两端,当有意思进栈时,栈顶位置从栈的两端迎面增长,当两个栈的栈顶相遇时,栈满。
两个共享栈的数据结构类型定义如下:
typedef struct
{
DataType stack[StackSize];
int top[2];
}SSeqStack;
其中,top[1]和top[2]分别是两个栈的栈顶指针。
共享栈的算法操作:
(1)初始化操作。
void InitStack(SSeqStack *S)
{
S->top[0]=0;
S->top[1]=StackSize-1;
}
(2)进栈操作。
首先判断栈是否已满,另外还要通过一个标志变量flag判断是哪个栈要进行进栈操作。
int PushStack(SeqStack *S,DataType e,int flag)
{
if (S->top[0]==S->top[1])
{
printf("栈已满");
return 0;
}
switch(flag)
{
case 0:
S->stack[S->top[0]]=e;
S->top[0]++;
break;
case 1:
S->stack[S->top[1]]=e;
S->top[1]--;
break;
default:
return 0;
}
return 1;
}
(3)出栈操作。
int PopStack(SeqStack *S,DataType *e,int flag)
{
switch(flag)
{
case 0:
if (S->top[0]==0)
{
return 0;
}
S->top[0]--;
*e=S->stack[S->top[0]];
break;
case 1:
if (S->top[1]==StackSize-1)
{
return 0;
}
S->top[1]++;
*e=S->stack[S->top[1]];
break;
default:
return 0;
}
return 1;
}