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

用两个栈实现队列

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-25 16:25
梧州学院 Java
愿汐_:项目介绍那么长,然而你做了啥就一句话?
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-28 12:15
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-09 16:15
我应届生,去年10月份开始在这家公司实习,到今年10月份正好一年想(实习+试用期),在想要不要提前9月份就离职,这样好找工作些,但又差一个月满一年,又怕10月份国庆回来离职,容易错过了下半年的金九银十,到年底容易gap到年后
小破站_程序员YT:说这家公司不好吧,你干了快一年 说这家公司好吧,你刚毕业就想跑路说你不懂行情吧,你怕错过金九银十说 你懂行情吧,校招阶段在实习,毕业社招想换工作 哥们,我该怎么劝你留下来呢
应届生,你找到工作了吗
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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