左神算法笔记-栈和队列相互实现

45 阅读1分钟

栈实现队列

leetcode.cn/problems/im…

class MyQueue {
    // 定义两个栈
    Stack<Integer> in;
    Stack<Integer> out;

    public MyQueue() {
        in = new Stack<>();
        out = new Stack<>();
    }

    /**
     * 倒数据,从in栈倒到out栈,两个条件
     * 1. out 栈为空时才能倒
     * 2. in 栈倒的时候必须全都倒完
     */
    public void in2Out() {
        if (out.empty()) {
            while (!in.empty()) {
                out.push(in.pop());
            }
        }
    }

    public void push(int x) {
        // 数据先放到 in 栈,在倒到 out 栈
        in.push(x);
        in2Out();
    }

    public int pop() {
        in2Out();
        return out.pop();
    }

    public int peek() {
        in2Out();
        return out.peek();
    }

    public boolean empty() {
        return in.empty() && out.empty();
    }
}

队列实现栈

leetcode.cn/problems/im…

class MyStack {

    Queue<Integer> queue;

    public MyStack() {
        queue = new LinkedList<>();
    }
    
    // 将插入前队列中的元素,全部从队头出队,队尾入队
    public void push(int x) {
        int n = queue.size();
        queue.offer(x);
        while(n>0){
            queue.offer(queue.poll());
            n--;
        }
    }
    
    public int pop() {
        return queue.poll();
    }
    
    public int top() {
        return queue.peek();
    }
    
    public boolean empty() {
        return queue.isEmpty();
    }
}