7. 剑指offer系列——面试题09. 用两个栈实现队列

160 阅读1分钟

面试题09. 用两个栈实现队列

方法:一个栈存储元素,一个栈辅助

过程分析

  1. 假设栈1是要实现的队列,我们新增元素时要加在栈1底,如果栈1为空时可以直接添加, 如果栈1有值需要先把栈1的值按顺序压入栈2,添加元素之后,再由栈2压入栈1,根据栈的特性, 经过2次出栈入栈过程后,栈1的元素顺序不变
  2. 使用元素个数判断是否为空,初始大小为0,添加元素size+1,删除元素size-1

复杂度分析

  • 插入元素

时间复杂度:O(n)O(n)。插入元素时,对于已有元素,每个元素都要弹出栈两次,压入栈两次,因此是线性时间复杂度。 空间复杂度:O(n)O(n)。需要使用额外的空间存储已有元素

  • 删除元素

时间复杂度:O(1)O(1)。判断元素个数和删除队列头部元素都使用常数时间。 空间复杂度:O(1)O(1)。从第一个栈弹出一个元素,使用常数空间

class CQueue {
    Stack<Integer> stack1 = null;
    Stack<Integer> stack2 = null;
    int size;

    /**
     * 初始化栈
     */
    public CQueue() {
        stack1 = new Stack<Integer>();
        stack2 = new Stack<Integer>();
        size = 0;
    }

    public void appendTail(int value) {
        while (!stack1.isEmpty())
            // 把栈1的元素压入栈2
            stack2.push(stack1.pop());

        stack1.push(value);
        size ++;

        while (!stack2.isEmpty())
            // 把栈2的元素压入栈1
            stack1.push(stack2.pop());
    }

    public int deleteHead() {
        if (stack1.isEmpty())
            return -1;

        size --;
        return stack1.pop();
    }
}