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

问题分析:

在顺序栈的实现中,元素入栈是从下标为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;
  }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值