剑指offer第二版-9.用两个栈实现队列

本系列导航:剑指offer(第二版)java实现导航帖

面试题9:用两个栈实现队列

题目要求:
用两个栈,实现队列的从队尾插入元素offer()和从队头抛出元素poll()
相关:用队列实现栈

思路:
(1)对于插入操作,栈与队列都是从队尾进行,因此一行代码就可以完成offer()
(2)对于弹出操作,队列先进先出从队头开始,而栈后进先出从队尾开始,要想取到队头元素,就得需要第二个栈stack2的协助:弹出时将stack1的元素依次取出放到stack2中,此时stack2进行弹出的顺序就是整个队列的弹出顺序。而如果需要插入,放到stack1中即可。
总结下,stack1负责插入,stack2负责弹出,如果stack2为空了,将stack1的元素依次弹出并存放到stack2中,之后对stack2进行弹出操作。

代码:

package chapter2;
import java.util.Stack;

/**
 * Created by ryder on 2017/6/20.
 * 用两个栈实现队列
 */
class MyQueue<T>{
    private Stack<T> stack1 = new Stack<>();
    private Stack<T> stack2 = new Stack<>();
    
    public void offer(T data){
        stack1.push(data);
    }
    public T poll(){
        if(!stack2.isEmpty()){
            return stack2.pop();
        }
        else if(!stack1.isEmpty()){
            while(!stack1.isEmpty())
                stack2.push(stack1.pop());
            return stack2.pop();
        }
        else
            return null;
    }
}

public class P68_QueueWithTwoStacks {
    public static void main(String[] args){
        MyQueue<Integer> myQueue = new MyQueue<>();
        System.out.println(myQueue.poll());
        myQueue.offer(1);
        myQueue.offer(2);
        myQueue.offer(3);
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        myQueue.offer(4);
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
        System.out.println(myQueue.poll());
    }
}

运行结果

null
1
2
3
4
null
    原文作者:ryderchan
    原文地址: https://www.jianshu.com/p/e92f42b892d0#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞