LeetCode225用队列实现栈

用队列实现栈

问题描述

在这里插入图片描述
问题链接:https://leetcode-cn.com/problems/implement-stack-using-queues/

分析

首先我们要明确的特点是先进后出,而队列的特点是先进先出,我们不可能用一个队列来完成这个操作,所以我们需要用两个队列来完成。我们主要关心入栈(push)和出栈(pop)即可。

有两个队列,我们时刻要保证一个队列为空,这是解题的关键。

  • 入栈push():最开始的情况,两队列都为空,我们随便选一个队列插入元素即可offer(),然后后续要压入元素的话,选择非空的队列入队列即可。(时刻保持一个队列为空)
  • 出栈pop():出栈就比较复杂了。我们先将非空队列(假设qu1)中的size-1个元素依次放到另一个空队列中(qu2),此时qu1中只剩最后一个入队列的元素(这个元素最后入队列,但是栈的话最后入栈的要最先出去)所以此时,将qu1的最后一个元素出队列即可poll()(它最后入的栈,却最先出的栈,满足要求)(时刻保持一个队列为空
  • 获取栈顶元素top():和出栈类似,只是有些需要注意的地方,因为获取栈顶元素而不是弹出,我们在出栈的基础上需要移动size个元素了,而且我们要将其保存起来最后用作返回(保证是栈顶元素)。不然全移完了,最后返回的是最先入栈的元素。(时刻保持一个队列为空)

下面结合图片来理解一下

  • 入栈

在这里插入图片描述

  • 出栈

在这里插入图片描述

  • 得到栈顶元素

在这里插入图片描述

AC代码

class MyStack {

    private Queue<Integer> qu1=new LinkedList<>();
    private Queue<Integer> qu2=new LinkedList<>();
    /** Initialize your data structure here. */
    public MyStack() {

    }
    
    /** Push element x onto stack. */
    public void push(int x) {
        if(!qu1.isEmpty())
        {
            qu1.offer(x);
        }else if(!qu2.isEmpty())
        {
            qu2.offer(x);
        }else{
            //第一次默认放到qu1当中
            qu1.offer(x);
        }
        
    }
    
    /** Removes the element on top of the stack and returns that element. */
    public int pop() {
       if(empty())
       {
           return -1;
       }
       if(!qu1.isEmpty())
       {
           int size=qu1.size()-1;
           while(size!=0)
           {
               qu2.offer(qu1.poll());
               size--;
           }
           return qu1.poll();
       }else{
           int size=qu2.size()-1;
           while(size!=0)
           {
               qu1.offer(qu2.poll());
               size--;
           }
           return qu2.poll();
       }
    }
    
    /** Get the top element. */
    public int top() {
      if(empty())
      {
          return -1;
      }
      if(!qu1.isEmpty())
      {
          int size=qu1.size();
          int ret=0;//用作最后返回
          while(size!=0)
          {
              ret=qu1.poll();
              qu2.offer(ret);
              size--;
          }
          return ret;
      }else{
          int size=qu2.size();
          int ret=0;
          while(size!=0)
          {
              ret=qu2.poll();
              qu1.offer(ret);
              size--;
          }
          return ret;

      }
    }
    
    /** Returns whether the stack is empty. */
    public boolean empty() {
       return qu1.isEmpty()&&qu2.isEmpty();
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值