欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用两个栈实现队列——剑指Offer

程序员文章站 2022-03-05 13:10:51
...

题目描述

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

题目分析

我们先要明确栈和队列的特点,栈最大的特点是先进后出,队列最大的特点是先进先出,因此如何用两个栈来构建一个队列能,我们可以通过下面的例子来分析一下。

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

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

此时我们需要弹出一个数,因为队列是先进先出的特点,a是最先进入的,所以我们应该弹出a,但是在栈stack1中a在最下面,我们要弹出a,首先要弹出b和c,因此我们就需要借助栈stack2,将b和c压入栈stack2,然后栈stack1中就只剩下a元素,直接弹出就好了。

将b和c压入栈stack2中时应该要注意压入栈中的顺序,因为b先入栈stack1,所以b出栈stack1时在c的后面,所以现在情况是:

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

此时如果需要队列做弹出操作,就可以直接弹出栈stack2的栈顶,弹出后情况如下:

栈 stack1:{}
栈 stack2:{c}

若此时需要在队列中插入一个数d,还是选择插入栈stack1,插入后情况为:

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

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

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

由此我们可以发现一个规律,就是如果队列要插入一个元素都是插入栈stack1,栈stack2作为弹出操作的辅助栈,而如果队列希望弹出一个元素则要分两种情况:1.栈stack2不为空则直接弹出栈stack2的栈顶。2.若栈stack2为空,栈stack1不为空,此时需要将栈stack1中的元素全部压入栈stack2中,然后再弹出栈stack2中的元素。

要点:
1.入队列操作只在栈stack1中进行,出队列操作只在栈stack2中进行。
2.只有在一次性将栈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.size()!=0)
        {
           return stack2.pop();
        }
        else
        {
            while(stack1.size()!=0)
                stack2.push(stack1.pop());
            return stack2.pop();
        }
    }
相关标签: 剑指Offer Offer