一个数组实现两个栈(共享栈)

问题分析:

在顺序栈的实现中,元素入栈是从下标为0的位置向上增长的,出栈是通过size--实现的。要想用一个数组实现2个栈,可以除了下标从0开始增长,还同时让另一个栈下标从size-1处开始减少。

问题解决:

定义top1,top2分别代表2个栈栈顶的下一个位置的下标。栈1入栈时,元素放入top1位置,再使top1++;栈2入栈时,元素放入top2位置,再使top2--。出栈时,栈1 top1--;栈2 投top2 ++。

代码实现:

//共享栈
#define size 10
typedef struct sharedstack
{                                                                                                                                    
    StackType data[size];
    size_t top1;
    size_t top2;
}sharedstack;
void InitShared(sharedstack* s);
void PushShared1(sharedstack* s, StackType elem);
void PushShared2(sharedstack* s, StackType elem);
void PopShared1(sharedstack*s);
void PopShared2(sharedstack*s);
int TopShared1(sharedstack* s, StackType* top);
int TopShared2(sharedstack* s, StackType* top);
  void InitShared(sharedstack* s)
  {
      assert(s);
      s->top1 = 0;
      s->top2 = size-1;
      return;
  }
  void PushShared1(sharedstack* s, StackType elem)
  {
      assert(s);
      if(s->top1 > s->top2)
          return;
      s->data[s->top1++] = elem;
      return;
  }
  void PushShared2(sharedstack* s, StackType elem)
  {
      assert(s);
      if(s->top1 > s->top2)
          return;                                                                                                                    
      s->data[s->top2--] = elem;
      return;
  }
  void PopShared1(sharedstack*s)
  {
      assert(s);
      if(s->top1 == 0)
          return;
      --s->top1;
      return;
  }
  void PopShared2(sharedstack*s)
  {
      assert(s);
      if(s->top2 == size-1)
          return;
      ++s->top2;
      return;
  }
  int TopShared1(sharedstack* s, StackType* top)
  {
      assert(s);
      assert(top);
      if(s->top1 == 0)
          return 0;
      *top = s->data[s->top1-1];
      return 1;
  }
  int TopShared2(sharedstack* s, StackType* top)
  {
      assert(s);
      assert(top);
      if(s->top2 == size-1)
          return 0;
      *top = s->data[s->top2 +1];
      return 1;
  }



猜你喜欢

转载自blog.csdn.net/weixin_40417029/article/details/79897318