栈与队列的互相实现

经常在力扣上或者是面试中遇到

如何用栈去实现一个队列

如何用队列去实现一个栈

这两个问题都需要使用两个数据结构去实现一个数据结构

先看第一个问题

栈先进后出,队列先进先出

那问题就是用栈实现先进先出

所以我们会用一个栈instack用作输入,另一个outstack用作输出

这个问题的难点在于输入转移输出的时机

如果每次输入的时候转移,等于没转移

如果每次输出的时候转移,那么后来的输入会被移到输出栈的栈顶

所以我们应该在输出栈为空并且要pop或者peek的时候转移

这个时候写个转移的方法然后在peek和pop的时候调用就ok了

下面看代码

class MyQueue {
    Deque inStack;
    Deque outStack;

    public MyQueue() {
        inStack = new LinkedList();
        outStack = new LinkedList();
    }
    
    public void push(int x) {
        inStack.push(x);
    }
    
    public int pop() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.pop();
    }
    
    public int peek() {
        if (outStack.isEmpty()) {
            in2out();
        }
        return outStack.peek();
    }
    
    public boolean empty() {
        return inStack.isEmpty() && outStack.isEmpty();
    }

    private void in2out() {
        while (!inStack.isEmpty()) {
            outStack.push(inStack.pop());
        }
    }
}

再看第二个问题

问题的核心还是转移的时机

怎么转移才能使得后来的在最前面

这里就必须在入队的时候转移了

这里有两个队列,q1操作队,q2辅助队

每次入队先在q2入队,然后把q1的元素依次入队到q2中

再交换q1,q2

此时q1为我们要的队列,q2为空

下面看代码

class MyStack {
    Queue queue1;
    Queue queue2;

    public MyStack() {
        queue1 = new LinkedList();
        queue2 = new LinkedList();
    }
    
    public void push(int x) {
        queue2.offer(x);
        while (!queue1.isEmpty()) {
            queue2.offer(queue1.poll());
        }
        Queue temp = queue1;
        queue1 = queue2;
        queue2 = temp;
    }
    
    public int pop() {
        return queue1.poll();
    }
    
    public int top() {
        return queue1.peek();
    }
    
    public boolean empty() {
        return queue1.isEmpty();
    }
}

你可能感兴趣的:(java,开发语言)