1 思路
如果有两个类型相同的栈,我们为它们分别开辟了数组空间。极有可能是一个栈已经满了,再入栈就溢出了,而另一个栈却还有很多存储空间。这又何必呢?我们完全可以用一个数组来存储两个栈,只不过需要一些小的技巧。
我们的做法如下,数组有两个端点,两个栈有两个栈底。让一个栈的栈底为数组的始端,即数组下标为0的位置。让另一个栈的栈底为数组的末端,即数组下标为n-1的位置。这样如果两个栈增加元素,就是两端点向中间延伸。
其实关键思路是:它们是在数组的两端,向中间靠拢。top1和top2是两个栈的栈顶指针。只要它们两个不见面,两个栈就可以一直使用。
2 两栈共享空间的结构代码
typedef struct { SElemType data[MAXSIZE]; int top1; //栈1的栈顶指针(top1==-1,表示栈1为空) int top2; //栈2的栈顶指针(top2==MAXSIZE,表示栈2为空) }SqDoubleStack;
3 入栈操作
Status push(SqDoubleStack *S, SElemType e, int stackNumber) { if (S->top1 + 1 == S->top2) { //栈满 return ERROR; } if (stackNumber == 1) { //表示栈1有元素进栈 top1 ++; S->data[top1] = e; } else if (stackNumber == 2) { //表示栈2有元素进栈 top2--; S->data[top2] = e; } return OK; }
4 出栈操作
Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber) { if (stackNumber == 1) { //说明是删除栈1元素 if (S->top1 == -1) { //栈1空 return ERROR; } *e = S->data[S->top1] S->top1--; } else if (stackNumber == 2) { //说明是删除栈2元素 if (S->top2 == MAXSIZE) { //栈2空 return ERROR; } *e = S->data[S->top2]; S->top2++; } return OK; }