使用两个队列实现一个栈

本文介绍了一种使用两个队列来模拟栈数据结构的方法。通过不断转移队列中的元素,可以确保最后剩下的元素即为栈顶元素,以此实现栈的先进后出特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题分析:

观察队列和栈的特点,队列是先进先出的,而栈是先进后出的。也就是说,要使用队列实现一个栈,就是利用队列实现先进后出的规律。当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;
  }













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值