题解 | #用两个栈实现队列#

用两个栈实现队列

https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6

什么是队列?

想象一下你在学校排队领午餐。你来到队伍的末尾加入队伍,当你前面的人都领完午餐后,你就能够领取自己的午餐。这就是队列的工作原理——先进先出(First In First Out, FIFO)。

用两把椅子来实现队列

现在,我们有两把椅子(栈),我们把它们叫做 A 和 B。我们的目标是用这两把椅子来模仿排队的行为。

插入元素(Push)

  • 当有人加入队伍时(插入元素),我们让他坐在椅子 A 上。

删除元素(Pop)

  • 当我们需要让一个人离开队伍(删除元素)时,我们需要确保最先加入队伍的人最先离开。
  • 如果椅子 B 上有人,那么这个人就是最先加入队伍的人,他可以直接离开(删除)。
  • 如果椅子 B 是空的,我们就把椅子 A 上的人一个个移到椅子 B 上。这样一来,最先加入队伍的人就会坐在椅子 B 的最上面,他就可以离开了(删除)。

具体步骤

加入队伍(Push)

  1. 新来的朋友直接坐到椅子 A 上。

离开队伍(Pop)

  1. 如果椅子 B 上有朋友,让椅子 B 上面的朋友离开。
  2. 如果椅子 B 是空的,把椅子 A 上所有的朋友都搬到椅子 B 上,然后让椅子 B 上面的朋友离开。

示例

假设有如下操作:

  1. 朋友 1 加入队伍。
  2. 朋友 2 加入队伍。
  3. 朋友 1 离开队伍。
  4. 朋友 2 离开队伍。

我们会这样做:

  1. 朋友 1 坐到椅子 A 上。
  2. 朋友 2 坐到椅子 A 上。
  3. 椅子 B 是空的,所以先把椅子 A 上的朋友移动到椅子 B 上,然后让椅子 B 上面的(也就是朋友 1)离开。
  4. 再次检查,发现椅子 B 还有一个朋友(朋友 2),让他离开。

下面是简单的代码实现:

import java.util.Stack;

class QueueWithTwoStacks {
    private Stack<Integer> stack1 = new Stack<>();
    private Stack<Integer> stack2 = new Stack<>();

    // 向队列尾部插入整数
    public void push(int value) {
        stack1.push(value);
    }

    // 从队列头部删除整数
    public int pop() {
        // 如果stack2为空,则将stack1中的所有元素转移至stack2
        if (stack2.isEmpty()) {
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        // 从stack2中弹出元素,此时stack2的顶部元素是最先进入stack1的元素
        return stack2.pop();
    }
}

如果这篇文章对你有帮助,请点个免费的攒👍,让能够帮助更多的人。

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务