题目: 设计两个栈 S1、S2 都采用顺序栈方式,并且共享一个存储区[0,MaxLen-1], 为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式,如下图 1所示。设计一个有关栈的入栈和出栈算法
图1

分析: 两栈共享存储空间,需要解决的关键问题在于如何判断栈满和栈空,由于 两栈共享存储空间,入栈和出栈的时候还需要区分是哪个栈。
设 lsTop 是左栈(数组 下标为 0 的一端为栈底)栈顶指针,rsTop 为右栈(数组下标为 MaxLen-1 的一端为栈 底)栈顶指针。
显然,当两个栈都为空时,lsTop==-1,rsTop==MaxLen,如图2所 示;当栈满时,rsTop 和 lsTop 存在以下关系:rsTop==lsTop+1,如下图3 所示。
图2


伪代码实现:
一、入栈
操作接口:void Push(int i, DataType x);
1. 如果栈满,则抛出上溢异常;
2. 判断是插在栈1还是栈2;
2.1 若在栈1插入,则
2.1.1 top1加1;
2.1.2 在top1处填入数据x;
2.2 若插在栈2,则
2.2.1 top2减1;
2.2.2 在top2处填入数据x;
二、出栈
操作接口:DataType Pop(int i);
1. 若是在栈1删除,则
1.1 若栈1为空栈,抛出下溢异常;
1.2 删除并返回栈1的栈顶元素;
2. 若是在栈2删除,则
2.1 若栈2为空栈,抛出下溢异常;
2.2 删除并返回栈2的栈顶元素;
代码实现:
一、入栈
入栈,s=1,入左栈,s=2,入右栈,x 为入栈元素
void push(int s,int x)
{
if(rsTop == lsTop+1)//栈满
{
printf("栈已满!\n");
return;
}
if(s==1)//入左栈
{
dsStack[lsTop++] = x;
}
else if(s == 2)//入右栈
{
dsStack[rsTop--] = x;
}
else
printf("该栈不存在!\n");
return;
}
二、出栈
int pop(int s,int *x)
{
if(s==1)//出左栈
{
if(lsTop == -1)
{
printf("栈已空!\n");
return 0;
}
*x = dsStack[lsTop--];
}
else if(s == 2)//出右栈
{
if(rsTop == MaxLen)
{
printf("栈已空!\n");
return 0;
}
*x = dsStack[rsTop++];
}
else
{
printf("该栈不存在!\n");
return 0;
}
return 1;
}