【剑指offer】用两个栈实现队列 -- Java实现

用两个栈实现队列

https://www.nowcoder.com/questionTerminal/54275ddae22f475981afa2244dd448c6?answerType=1&f=discussion

【剑指offer】用两个栈实现队列 -- Java实现

题解

1. 分析

队列的特性是:“先入先出”,栈的特性是:“先入后出”

当我们向模拟的队列插入数 a,b,c 时,假设插入的是 stack1,此时的栈情况为:

  • 栈 stack1:{a,b,c}
  • 栈 stack2:{}

当需要弹出一个数,根据队列的"先进先出"原则,a 先进入,则 a 应该先弹出。但是此时 a 在 stack1 的最下面,将 stack1 中全部元素逐个弹出压入 stack2,现在可以正确的从 stack2 中弹出 a,此时的栈情况为:

  • 栈 stack1:{}
  • 栈 stack2:{c,b}

继续弹出一个数,b 比 c 先进入"队列",b 弹出,注意此时 b 在 stack2 的栈顶,可直接弹出,此时的栈情况为:

  • 栈 stack1:{}
  • 栈 stack2:{c}

此时向模拟队列插入一个数 d,还是插入 stack1,此时的栈情况为:

  • 栈 stack1:{d}
  • 栈 stack2:{c}

弹出一个数,c 比 d 先进入,c 弹出,注意此时 c 在 stack2 的栈顶,可直接弹出,此时的栈情况为:

  • 栈 stack1:{d}
  • 栈 stack2:{c}

根据上述栗子可得出结论:

  1. 当插入时,直接插入 stack1
  2. 当弹出时,当 stack2 不为空,弹出 stack2 栈顶元素,如果 stack2 为空,将 stack1 中的全部数逐个出栈入栈 stack2,再弹出 stack2 栈顶元素

2. 代码

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 (stack2.size() <= 0) {
            while (stack1.size() != 0) {
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

3. 复杂度

push时间复杂度:
pop空间复杂度:

全部评论
很棒,stack1先进后出,把stack1转到stack2后,stack2中 整体来看就等于先进先出了。使用stack1进,stack2出,赞~!
2 回复 分享
发布于 2019-10-01 16:32
为什么stack.size()需要<=0啊,直接=0不可以吗
2 回复 分享
发布于 2020-02-22 15:49
如果栈中的元素个数少于pop()的次数,会报错Exception in thread "main" java.util.EmptyStackException,应该再加个队列为空的判断条件,如果 stack1.size()+stack2.size()!=0 应该直接返回
1 回复 分享
发布于 2019-09-09 13:55
我是直接stack.empty()判断了
1 回复 分享
发布于 2020-03-25 22:58
非常妙,学到了
1 回复 分享
发布于 2020-04-30 11:33
不考虑还需要把stack2 push进stack1吗
1 回复 分享
发布于 2021-04-20 10:23
如果pop之后再push不就乱了吗。
点赞 回复 分享
发布于 2019-08-28 19:05
pop()不是void类型的函数嘛?
点赞 回复 分享
发布于 2019-09-04 23:32
分析的这句话”继续弹出一个数,b 比 c 先进入,b 弹出,”是不是错了,b比应该比c后进入stack2吧
点赞 回复 分享
发布于 2019-09-19 18:33
pop 均摊算法时间复杂度应该是 O(1)
点赞 回复 分享
发布于 2019-09-19 21:51
如果stack1和stack2都为空的话pop方***报异常
点赞 回复 分享
发布于 2020-05-06 22:19
想问一下public void push(int node); 这行里面的push()是自定义的方法名吗还是固定用法,感觉是自定义方法名,但是当我写public void pushmethod(int node);的时候会报错。望大神能帮忙解惑,不胜感谢。
点赞 回复 分享
发布于 2020-08-28 17:33
为什么非要判断stack为空或stack.size()<=0呢?求知道的朋友告知一下,感谢,感谢!
点赞 回复 分享
发布于 2020-09-20 21:36
说的就有问题
点赞 回复 分享
发布于 2021-10-11 20:50
举个例子,比如一开始把数据1、2、3入stack2,进行pop操作得到3,这时再执行push 4、5,按这种写法再次执行pop,得到的结果不是最新入栈的5,而是2,因此应该在pop操作后再将数据存回stack1
点赞 回复 分享
发布于 2021-12-28 09:47
学习了
点赞 回复 分享
发布于 2022-06-27 15:23
思路奇妙,学习了
点赞 回复 分享
发布于 2022-08-15 10:35

相关推荐

Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
点赞 评论 收藏
分享
189 15 评论
分享
牛客网
牛客企业服务