题目

使用栈实现队列的下列操作:   push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。


思路

要想让栈操作实现队列的效果,只靠一个栈肯定不行,毕竟栈是“后入先出”的原则,我们可以用两个开口相反的栈来达到队列的效果。一个输入栈,一个输出栈,如下图: 这样输入栈输出的元素,可以变成输出栈输入的元素,再输出就可以达到队列的效果。但前提是,必须要让输入栈为空才可以。   e7de48d62c14d1accfd93c7e0f793a3.jpg

class MyQueue {

    Stack<Integer> stackIn;
    Stack<Integer> stackOut;

    public MyQueue() {
        stackIn = new Stack<>();
        stackOut = new Stack<>();
    }
    
    public void push(int x) {
        stackIn.push(x);
    }
    
    public int pop() {
        dumpstackIn();         
        return stackOut.pop();
    }
    
    public int peek() {
        dumpstackIn();         
        return stackOut.peek();
    }
    
    public boolean empty() {
        return stackOut.isEmpty() && stackIn.isEmpty();
    }

    //如果stackOut为空,将stackIn中的元素全部放到stackOut中
    private void dumpstackIn(){
        if(!stackOut.isEmpty()) return;
        while(!stackIn.isEmpty()){
            stackOut.push(stackIn.pop());
        }
    }
}