剑指 Offer - 05 - 用两个栈实现一个队列

发布于 2024-07-17 10:49:38 字数 2601 浏览 8 评论 0

题目

用两个栈来实现一个队列,完成队列的 PushPop 操作。 队列中的元素为 int 类型。

解析

这题也比较简单。两种思路:

思路一:

  • push 的时候直接放到 stack1
  • 为了 pop 的操作,当 stack2 空(必须当 stack2 为空) 的时候,一次性(必须一次性) 要将 stack1 的全部 pushstack2 中;
  • 然后 pop() 的时候,取的就是 stack2 的栈顶;

看个例子:

代码:

import java.util.Stack;

public class Solution {

    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node) {
        stack1.push(node);
    }

    public int pop() {
        if (stack1.isEmpty() && stack2.isEmpty())
            throw new RuntimeException("Queue is empty!");
        if (stack2.isEmpty()) {   //如果 stack2 不空的话,就先不要将 stack1 的内容放进去
            while (!stack1.isEmpty())
                stack2.push(stack1.pop());
        }
        return stack2.pop();
    }
}

思路二:

  • 每次从队列中取队头元素的时候,都是取 stack2.pop() (栈顶),每次 push 都是 pushstack1
  • push 的时候,如果 stack2 不空,就要将 stack2 的全部倒入 stack1 中;然后再 push 新元素;
  • pop() 取元素的时候,如果 stack1 不空,就要先全部倒入 stack2 ,因为 stack1 最下面的是最早进来的,所以要最先出去,利用 stack2 倒转一下;

看个例子就懂了:

代码:

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();

    public void push(int node) {
        while (!stack2.isEmpty())
            stack1.push(stack2.pop());
        stack1.push(node);
    }

    public int pop() {
        if (stack1.isEmpty() && stack2.isEmpty())
            throw new RuntimeException("Queue is Empty!");
        while (!stack1.isEmpty())
            stack2.push(stack1.pop());
        return stack2.pop();
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

病毒体

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文