力扣232:用栈实现队列【java语言实现】

本文介绍了如何用两个栈模拟队列,通过`push`元素入栈,`pop`时从第一个栈移至第二个栈,同时处理了栈非空时的特殊情况。重点在于判断栈是否为空以及何时添加新元素的逻辑。
摘要由CSDN通过智能技术生成

题目链接力扣232:用栈实现队列

        根据题目要求:要用栈实现队列中的相关方法,收先要明确栈和队列的相关特性

栈:   先进后出

队列:先进先出

先让数字1,2,3,4分别依次进入栈和队列中,观察一下:

        接下来弹出一个元素:可以看到:队列中弹出的元素是1,栈中弹出的元素是4;不管我们怎么操作用一个栈实现队列的功能是不可能的【首先我们要意识到这个问题】,一个不行,那就用两个栈来实现这个功能,要想弹出元素1,需要依次把栈中的所有元素弹出,放到另一个栈中;如图所示:

        此时,我们就会发现队列弹出元素1时,栈1也可以弹出元素1,实现了栈和队列的同步

我们先创建两个栈【我们采用力扣给我们提供的模板:在构造方法中创建两个栈】

要添加元素用栈stackIn;

要弹出元素用栈stackOut;

   //全局变量
     Stack<Integer> stackIn;
     Stack<Integer> stackOut;
     public MyQueue() {
        stackIn = new Stack<>(); // 负责进栈
        stackOut = new Stack<>(); // 负责出栈
    }

先补充一下java中Stack中常用的方法:

  • push(E item):将元素入栈,即将元素放置在栈顶。
  • pop():弹出并返回栈顶的元素。如果栈为空,则抛出EmptyStackException异常。
  • peek():返回栈顶的元素,但不弹出它。如果栈为空,则抛出EmptyStackException异常。
  • empty():测试栈是否为空。

接下来,只需要写一个函数【move()函数】【逻辑是从stackIn栈中依次弹出元素放进satckOut中】,很简单就是一个循环如下:

  //力扣中提供的int pop() 从队列的开头移除并返回元素
    public int pop() {
        //调用方法
        move();  
        //弹出元素     
        return stackOut.pop();
    }

    public void  move(){
        if(!stackOut.isEmpty()){return;}
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }  
    }

*重点是while循环上面的判断条件:为什么要添加这个判断条件?我们来考虑一下这种情况:

经过添加,删除元素以后,栈和队列中的元素情况如图所示:

此时,我们能直接执行while()循环的逻辑【栈不为空,把栈2中的元素添加到栈1中去】吗?

        假设执行上述逻辑后,5进入到栈1;此时,我想弹出一个元素,队列中弹出的是2,而栈中弹出的元素是1,明显是错误的!错误原因就在于:stackOut栈还没有空,就又添加了一个新的元素;因此,要进行逻辑判断:当栈1不为空时,不能添加新元素,逻辑为:

if(!stackOut.isEmpty()){return;}

        还有就是判空的逻辑:根据上述逻辑可知,当两个栈都为空时,我们才能说我们构造的这个队列为空。逻辑为:

    public boolean empty() {
        return  stackIn.isEmpty() &&  stackOut.isEmpty(); 
    }

完整代码:

class MyQueue {
    Stack<Integer> stackIn;
    Stack<Integer> stackOut;
    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        move();       
        return stackOut.pop();
    }
    
    public int peek() {
       move();
        return stackOut.peek();      
    }
    
    public boolean empty() {
        return  stackIn.isEmpty() &&  stackOut.isEmpty(); 
    }
    public void  move(){
        if(!stackOut.isEmpty()){return;}
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }  
    }
}

  • 24
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

〖七月〗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值