剑指offer之用两个栈实现队列

题目来自牛客网:https://www.nowcoder.com/practice/54275ddae22f475981afa2244dd448c6?tpId=13&tqId=11158&tPage=1&rp=1&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

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

解答:栈的特性是先进后出,而队列的特性是先进先出。

实现方法如下图:

在存入数据时,先将数据压入栈一,比如存入abc,之后要删除队列中第一个元素(a),此时,将栈一的数据压入栈二,按照栈顶出栈的顺序,栈底为c,之后为b,栈顶为a。此时弹出栈二的栈顶元素即为存入的第一个元素a。当插入元素时,还是将数据压入栈一。

于是在push函数中,执行将数据压入栈一即可

在pop函数中,首先判断栈二是否为空,为空则弹出栈二顶部的数据,不为空,就将栈一的数据全部压入栈二,再弹出栈二顶部数据。

剑指offer之用两个栈实现队列

这里再复习下Stack类,包含构造函数,empty函数,peek函数,pop函数,push函数,search函数。peek是返回栈顶元素,不过不移除,search的时间复杂度为O(n)。

剑指offer之用两个栈实现队列

代码如下:

import java.util.Stack;
 
public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    //stack1用来存
    public void push(int node) {
        stack1.push(node);
    }
    //stack2用来弹出
    public int pop() {
        if(stack2.empty())
        {
            while(!stack1.empty())
            {
                stack2.push(stack1.pop());
            }
        }
            return stack2.pop();
    }