力扣232题 用栈实现队列

原题:

使用栈实现队列的下列操作:

push(x) – 将一个元素放入队列的尾部。
pop() – 从队列首部移除元素。
peek() – 返回队列首部的元素。
empty() – 返回队列是否为空。
示例:

MyQueue queue = new MyQueue();

queue.push(1);
queue.push(2);
queue.peek(); // 返回 1
queue.pop(); // 返回 1
queue.empty(); // 返回 false
说明:

你只能使用标准的栈操作 – 也就是只有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
你所使用的语言也许不支持栈。你可以使用 list 或者 deque(双端队列)来模拟一个栈,只要是标准的栈操作即可。
假设所有操作都是有效的 (例如,一个空的队列不会调用 pop 或者 peek 操作)。

解题思路:

栈(stack)是后入先出的数据结构;
队列(queue)是先入先出的数据结构;
使用双栈的原因:能通过b栈将原a栈的数据倒置,此时栈的top,也就是队列的peek。可以实现队列的peek和pop操作。操作完再把b栈转换回a栈,这样当再push数据进栈的时候顺序才会正确。
举个例子
如果队列是按1, 2, 3…进入的,那么栈中元素为[…,3, 2, 1],弹出操作就是队列的弹出顺序。当[1],来一个2怎么办?我们压入2,变成[1, 2],不行阿,我们要[2, 1],所以,我们可以再用一个中间栈,把目前栈中先压入中间栈中,让栈变空,压入来的数2,再将中间栈压会一开始栈中,变成了 [1, 2],再来一个数也是这样!

Java代码如下:

class MyQueue {
    private Stack a;// 输入栈
    private Stack b;// 输出栈
    
    public MyQueue() {
        a = new Stack<>();
        b = new Stack<>();
    }
    
    public void push(int x) {
        a.push(x);
    }
    
    public int pop() {
        // 如果b栈为空,则将a栈全部弹出并压入b栈中,然后b.pop()
        if(b.isEmpty()){
            while(!a.isEmpty()){
                b.push(a.pop());
            }
        }
        return b.pop();
    }
    
    public int peek() {
        if(b.isEmpty()){
            while(!a.isEmpty()){
                b.push(a.pop());
            }
        }
        return b.peek();
    }
    
    public boolean empty() {
        return a.isEmpty() && b.isEmpty();
    }
}

有疑问或者发现bug可私信我

你可能感兴趣的:(Java,算法问题)