剑指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

推荐阅读更多精彩内容

  • 本系列导航:剑指offer(第二版)java实现导航帖 用队列实现一个栈题目要求:用两个队列,实现栈的从队尾插入元...
    ryderchan阅读 1,868评论 2 2
  • 栈 栈的英文单词是Stack,它代表一种特殊的线性表,这种线性表只能在固定一端(通常认为是线性表的尾端)进行插入,...
    Jack921阅读 758评论 0 5
  • 用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。 ...
    echoVic阅读 1,289评论 0 2
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 141,624评论 20 608
  • 南方的小城市放眼过去旧绿色,在前些日子宿舍楼下一排排的树枝被修剪本来应该咯吱,风吹过发出响声。可惜如此孤立的存在拥...
    云端的人阅读 210评论 0 1