数据结构-栈(3)

两栈共享空间

可以用一个数组来存储两个相同类型的栈。

数组有两个端点,两个栈有两个栈底,

让一个栈的栈底作为数组的开始端,下标为0处,

让另外一个栈的栈底作为数组的结束端,下标为n-1出。

两个栈如果增加元素,就是两个端点向中间延伸。

两个栈的栈底在数组两端, 新增元素,向中间考虑,即两个栈底的栈顶top1和 top2向中间靠拢, 只要top1和top2 不见面, 两个栈就可以一直使用。

当栈1为空时 top1 = -1

当栈2为空时 top2 = n

若栈2 是空栈, 栈1的top1 等于 n-1时, 就是栈1满了。

若栈1 是空栈, 栈2的的top2等于0时, 就是栈2满了。

两个栈见面时,也就是top1 和 top2之间差1时 , 即top1+1 = top2 是栈满。

    //两栈共享空间结构
  typedef struct{
    SElemType data[MAXSIZE];
    //栈1栈顶指针
    int top1;
    //栈2栈顶指针
    int top2;
  }


  //两栈push方法
  Status Push(SqDoubleStack *S, SElemType *e, int stackNumber){
    //栈已满, 不能再push新元素
    if(S->top1+1 == S->top2){
      return ERROR;
    }
    //栈1有新元素进栈, 则先top1+1给数组元素赋值
    if(stackNumber == 1){
      S->data[++s->top1] = e;
    }else if(stackNumber == 2){
    //栈2有新元素进栈, 则先top2-1给数组元素赋值
      S->data[--S->top2] = e;
    }

    return ok;
  }
  
  //两栈pop方法 若栈不为空,则删除S的栈顶元素,用e返回其值, 并返回OK; 否则返回ERROR
    Status Pop(SqDoubleStack *S, SElemType *e, int stackNumber){
        
        if(stackNumber == 1){
            //栈1已经是空栈
            if(S->top1 == -1){
                return ERROR;
            }
            //栈1的栈顶元素出栈
            *e = S->data[S->top1--];
        }else if(stackNumber == 2){
            //栈2已经是空栈
            if(S->top2 == MAXSIZE){
                return ERROR;
            }
            //栈2的栈顶元素出栈
            *e = S->data[S->top2++];
        }   
        
        return OK;
    }     
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » 数据结构-栈(3)