使用两个队列实现一个栈

问题分析:

观察队列和栈的特点,队列是先进先出的,而栈是先进后出的。也就是说,要使用队列实现一个栈,就是利用队列实现先进后出的规律。当pop元素时,最后一个pop的元素为栈的栈顶元素。

问题解决:

利用两个队列实现一个栈,当push元素时,push进非空的队列中;当pop元素时,先将元素依次pop出来,并push进另一个空队列中,直到只剩下一个元素。这是直接pop最后一个元素。这样就实现了栈先进后出的特点。

代码实现:

//两个队列实现一个栈
typedef struct stack
{
    SeqQueue q1;
    SeqQueue q2;
}stack;
void InitStack(stack* s);
void PushStack(stack* s, StackType elem);
void PopStack(stack* s);
int TopStack(stack* s, StackType* top);
  void InitStack(stack* s)                                                                                                           
  {
      assert(s);
      InitSeqQueue(&(s->q1));
      InitSeqQueue(&(s->q2));
      return;
  }
  void PushStack(stack* s, StackType elem)
  {
      assert(s);
      if(SizeSeqQueue(&(s->q1)) > 0)
          PushSeqQueue(&(s->q1), elem);
      else
          PushSeqQueue(&(s->q2), elem);
      return;
  }
  void PopStack(stack* s)
  {
      assert(s);
      size_t size1 = SizeSeqQueue(&(s->q1));
      size_t size2 = SizeSeqQueue(&(s->q2));
      if(size1 == 0 && size2 == 0)
          return;
      SeqQueue* exit = size1 > 0 ? &(s->q1) : &(s->q2);
      SeqQueue* entry = size2 == 0 ? &(s->q2) : &(s->q1);
      StackType elem;
      while(SizeSeqQueue(exit) > 1)
      {
          FrontSeqQueue(exit, &elem);
          PopSeqQueue(exit);
          PushSeqQueue(entry, elem);
      }
      PopSeqQueue(exit);
      return;
  }
  int TopStack(stack* s, StackType* top)
  {
      assert(s);
      assert(top);
      size_t size1 = SizeSeqQueue(&(s->q1));
      size_t size2 = SizeSeqQueue(&(s->q2));
      if(size1 == 0 && size2 == 0)
          return 0;
      SeqQueue* exit = size1 > 0 ? &(s->q1) : &(s->q2); 
      SeqQueue* entry = size2 == 0 ? &(s->q2) : &(s->q1);
      StackType elem;
      while(SizeSeqQueue(exit) > 0)
      {
          FrontSeqQueue(exit, &elem);                                                                                                
          PopSeqQueue(exit);
          PushSeqQueue(entry, elem);
      }
      *top = elem;
      return 1;
  }













猜你喜欢

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