一 概述
利用栈底位置相对不变的特性,可让两个顺序栈共享一个一维数组空间,将两个栈的栈底分别设置在共享空间的两端,两个栈顶向共享空间的中间延伸。
二 共享栈
如图所示,两个栈的栈顶指针都指向栈顶元素,top0=-1的时候0号栈为空,top1=MaxSize时1号栈为空;仅当两个栈顶指针相邻(top1-top0=1)时,判断为栈满。当0号栈进栈时top0先加1再赋值,1号栈进栈时top1先减1再赋值;出栈时则刚好相反。
共享栈是为了更有效地利用存储空间,两个栈的空间相互调节,只有在整个存储空间被占满时才发生溢出。其存取数据的时间复杂度均为O(1),所以对存取效率没有什么影响。
三 共享栈的实现
#include<stdio.h>
typedef int ElemType;
/*定义共享栈*/
#define MaxSize 10
typedef struct{
ElemType data[MaxSize];
ElemType top0;
ElemType top1;
}SharedStack;
/*初始化*/
void InitStack(SharedStack &S){
S.top0 = -1; //初始化栈顶指针
S.top1 = MaxSize;
}
/*判空*/
bool StackEmpty(SharedStack &S){
if(S.top0 == -1 && S.top1 == MaxSize)
return true;
else
return false;
}
/*入0号栈*/
bool PushStack0(SharedStack &S,ElemType x){
if(S.top0+1 == S.top1)
return false; //判断栈满
else
S.data[++S.top0] = x; //指针加1,再入栈
return true;
}
/*入1号栈*/
bool PushStack1(SharedStack &S,ElemType x){
if(S.top0+1 == S.top1)
return -1; //判断栈满
else
S.data[--S.top1] = x; //指针减1,再入栈
return true;
}
int PopStack(ElemType x){
return x;
}
int main(){
SharedStack S;
InitStack(S);
ElemType x;
for(int i = 1; i <= MaxSize/2; i++){
PushStack0(S,i);
PushStack1(S,MaxSize-i+1);
}
printf("top_Stack0:");
for(int i = 0; i < MaxSize/2; i++) {
printf("%d ",PopStack(S.data[S.top0-i]));
}
printf("\ntop_Stack1:");
for(int i = 0; i < MaxSize/2; i++) {
printf("%d ",PopStack(S.data[S.top1+i]));
}
return 0;
}
代码结果: