这个应该是以一个数组实现两个栈的共享。
-----------------------------------------------
| | | | | | | | | | | 长度为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; }
事实上,使用这样的数据结构,通常都是当两个栈的空间需求有相反关系时,也就是一个栈增长时另一个栈在缩短的情况。
注意:这只是针对两个具有相同数据类型的栈。