推荐

完整《剑指Offer》算法题解析系列请点击 👉 《剑指Offer》全解析 Java 版

 

题目描述

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

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        
    }
    
    public int pop() {
    
    }
}

 

题目分析:

先了解几个方法

  • push(x) ——将 x 插到队尾
  • pop() ——将队首的元素弹出,并返回该元素
  • empty() ——返回队列是否为空

还要知道  栈是 “先进后出”, 队列是 "先进先出" 。

现在我们有两个栈  stack1  和  stack2,我们插入三个数啊 a,b,c ,假设插入的是 stack1,此时情况如图:


如果此时执行 push(x) 方法的话,我们直接将 x 插入栈 stack1 即可。

如果此时执行 pop() 方法话,怎么将 a 直接弹出来呢? 
我没可以先将 stack1 中数依次拿出来 放到 stack2 中,此时情况如图:

那么此时,就可以直接将 a 弹出了。

我们也就模拟成了队列。

 

理下思路:

执行 push(x) 时,直接将 x 插入到 stack1

执行pop时,判断一下 stack 是否为空,不为空,直接弹出 stack2 栈顶的数;
如果为空,则先将stack1中的数依次插入到 stack2 中,然后再弹出 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(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

这里更新一下,虽然上面这个实现可以过牛客网的AC。

但是 push() 有问题。

当我们执行过一次pop之后,数据全在stack2了。

这个时候,如果push,会直接push进stack1;

当我们下一次pop的时候,就会有问题了。

 

 

实现:

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        if (stack1.empty()){
            while (!stack2.empty()){
                stack1.push(stack2.pop());
            }
        }
        stack1.push(node);
    }
    
    public int pop() {
    if (stack2.empty()){
        while (!stack1.empty()){
            stack2.push(stack1.pop());
        }
    }
       return  stack2.pop();
    }
}

 

看完之后,如果还有什么不懂的,可以在评论区留言,会及时回答更新。

这里是猿兄,为你分享程序员的世界。

非常感谢各位大佬们能看到这里,如果觉得文章还不错的话, 求点赞👍 求关注💗 求分享👬求评论📝 这些对猿兄来说真的 非常有用!!!

注: 如果猿兄这篇博客有任何错误和建议,欢迎大家留言,不胜感激!