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

class CQueue {
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;
    public CQueue() {
        this.stack1 = new Stack<>();
        this.stack2 = new Stack<>();
    }
    
    public void appendTail(int value) {
        //压入栈1
        stack1.push(value);
    }
    
    public int deleteHead() {
        if(stack2.isEmpty()){
            if(stack1.isEmpty()){
                //只有当栈1和栈2都为空时,才代表没有数据了,返回-1
                 return -1;
            }else{
                while(!stack1.isEmpty()){
                    //stack2为空,但是stack1不为空,则代表队列还有缓存数据未入队
                    //将这些缓存数据压入栈2中
                    stack2.push(stack1.pop());
                }
            }
        }
        return stack2.pop();
    }
}

 举例:

  添加四个元素{1,2,3,4}

  出队1次

  此时stack1为空 stack2.size == 3({2,3,4})

  添加元素5

  此时stack1.size == 1({5})  stack2.size == 3({2,3,4})

  连续执行三次出队操作

  此时stack1.size == 1({5})  stack2.size == 0,即stack2为空

  但是此时stack1不为空,代表着仍然有缓存元素未入队

  将stack1的元素全部弹栈并压入stack2

  此时stack1.size == 0即stack1为空  stack2.size == 1({5})

  执行一次出队操作

  此时stack1.size == 0即stack1为空  stack2.size == 0即stack2为空

  如果再执行出队操作,则返回-1

猜你喜欢

转载自www.cnblogs.com/hzqshuai/p/12304924.html