两栈共享空间


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;  
}                      

 

posted @ 2016-07-09 10:20  紫洁  阅读(3123)  评论(0编辑  收藏  举报