定义:
利用栈底位置相对不变的特性,可以让两个顺序栈共享一个一维数组的空间,栈底位于一维数组的两端,栈顶向共享空间的中间延伸
优势:
共享栈最大的优势是节省空间,避免出现“一栈满,一栈几乎未用”的情况出现
备注,当然,省空间可以用单链表模拟更舒服啦,因为是只在一端操作,所以不用担心存取复杂度的问题啦O(∩_∩)O
操作:
设置两个栈顶指针,top0 以及 top1 分别代表两个栈顶,初始值 top0 = 0,top1 = MaxSize ,随着数据的插入,top0 递增,top1 递减,出栈正好相反。当两个指针相差为1( top1 - top0 = 1 )时说明栈满
存取时间复杂度为 O(1)
下面给出两个栈s1,s2的共享栈方式
定义:
#define MaxSize 1000
typedef struct
{
int _stack[MaxSize];
int top[2];
}stk;
初始化:
void Init_Stack(stk &s)
{
s.top[0]=-1;
s.top[1]=MaxSize;
}
入栈操作:
bool stack_push(stk &s,int i,int a)
{
if(i<0||i>1) return false; //i代表栈的编号,栈号不对
if(abs(s.top[1]-s.top[0])==1) return false; //栈满报错
if(i==0)
{
s._stack[++s.top[i]]=a;
}
else
{
s._stack[--s.top[i]]=a;
}
return true;
}
出栈操作:
bool stack_pop(stk &s,int i,int &e)
{
if(i<0||i>1) return false; //i代表栈的编号,栈号不对
if(i==0)
{
if(s.top[i]<0) return false;
e=s._stack[s.top[i]--];
}
else
{
if(s.top[i]>MaxSize-1) return false;
e=s._stack[s.top[i]++];
}
return true;
}