这个应该是以一个数组实现两个栈的共享。
-----------------------------------------------
| | | | | | | | | | | 长度为10的数组

------------------------------------------------
top1(-1) top2(10)
如上图,假设初始top1为-1,top2为10,栈1push了一个数字2,栈2push了一个数字3之后,数组变成如下形式,top1为0,top2为9:

-----------------------------------------------
| 2 | | | | | | | | | 3 |

-----------------------------------------------
top1(0) top2(9)

当整个数组存满的时候top1+1=top2。比如栈1存了2、5、4、6、7,栈2存了3、9、4、8、1,此时top1=4,top2=5
----------------------------------------------------
| 2 | 5 | 4 | 6 | 7 | 1 | 8 | 4 | 9 | 3 |

typedef struct
{
    ElemType data[MAXSIZE];
    int top1;  //栈1栈顶指针
    int top2;  //栈2栈顶指针
}SqDoubleStack;
Status Push(SqDoubleStack *s , ElemType e , int stackNumber)
{
    if(s->top1+1 == s->top2)       //栈已满,不能再push新元素了
        return ERROR;
    if(stackNumber == 1)           //栈1有元素进栈
        s->data[++s->top1] = e;    //若栈1则先top+1后给数组元素赋值
    else if(stackNumber == 2)      //栈2有元素进栈
        s->data[--s->top2] = e;    //若栈2则先top2-1后给数组元素赋值
    return OK;

}

因为在开始已经判断了是否有栈满的情况,所以后面的top1+1或top2-1是不担心溢出问题的。

      对于两栈共享空间的pop方法,参数就只是判断栈1栈2的参数stackNumber,代码如下:

 

//若栈不空,则删除s的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
Status Pop(SqDoubleStack *s , ElemType *e , int stackNumber)
{
    if(stackNumber == 1)
    {
        if(s->top1 == 1)
            return ERROR;            //说明栈1已经是空栈,溢出
        *e = s->data[s->top1--];     //将栈1的栈顶元素出栈 
    }
    else if(stackNumber == 2)
    {
        if(s->top2 == MAXSIZE)
            return ERROR;            //说明栈2已经是空栈,溢出
        *e = s->data[s->top2++];     //将栈2的栈顶元素出栈
    }
    return OK;
}

 

   事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长时另一个栈在缩短的情况。

      注意:这只是针对两个具有相同数据类型的栈。