用栈实现队列动画详解

文章目录

  • 题目
  • 思路
  • 动画演示
  • 代码

题目

用栈实现队列动画详解_第1张图片

思路

  1. 创建两个栈AB, 栈A负责压入数据, 栈B用来弹出数据
  2. 如果是入队操作, 那就直接将数据压入栈A
  3. 如果是出队操作, 如果栈B不为空, 那返回栈B弹出的元素, 如果栈B为空, 那就将栈A中的所有元素依次出栈并压入栈B, 再弹出B的栈顶元素
  4. 如果是peek操作, 如果栈B不为空, 那返回栈B栈顶元素, 如果栈B为空, 那就将栈A中的所有元素依次出栈并压入栈B, 后返回B的栈顶元素(不弹出)

动画演示

用栈实现队列动画详解_第2张图片

代码

class MyQueue {
    Stack<Integer> stackA = new Stack<> ();
    Stack<Integer> stackB = new Stack<> ();
    //入栈的时候放在A里边,出栈的时候在B里边
    public MyQueue() {}
    
    public void push(int x) {
    //直接入栈A
        stackA.push(x);
    }
    
    public int pop() {
    	//如果栈B不为空,则栈B直接弹出
        if (stackB.size() != 0) {
            return stackB.pop(); //如果栈B中有元素,那就弹出栈B中的元素
        }
        //如果为空,则将栈A依次弹出后入栈B,再弹出
        while (stackA.size() > 0) {
            stackB.push(stackA.pop());
        }
        return stackB.pop();
    }
    
    public int peek() {
        if (stackB.size() != 0) {
            return stackB.peek();
        }
        while (stackA.size() > 0) {
            stackB.push(stackA.pop());
        }
        return stackB.peek();
    }
    
    public boolean empty() {
    	//两者都为空才为空
        return stackA.isEmpty() && stackB.isEmpty();
    }
}

你可能感兴趣的:(力扣,算法,数据结构)