剑指Offer09:用两个栈实现队列(Java)

题目描述:
在这里插入图片描述
解法1:
    这里使用两个LinkedList链表作为两个栈。思路很简单,我们用A栈作为主栈,B栈作为辅助栈。当元素添加时,把元素push到A栈中。然后删除元素时,按照题意,我们要删除的是栈底的元素,因为队是先进先出,但是使用pop方法只能删除栈顶元素。只时候,我们先判断A栈是否为空,A栈为空,则返回-1。A栈不为空,则while循环不断把A栈的元素pop出来,然后push到B栈中,此时B栈就相当于A栈的倒序。B栈的栈顶就是A栈的栈底。所以我们删除B栈栈顶,并返回值。同时将B栈元素重新pop出来,push到A栈即可。

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */
class CQueue {
    private LinkedList stackA;
    private LinkedList stackB;
    
    public CQueue() {
        stackA = new LinkedList();
        stackB = new LinkedList();
    }
    
    public void appendTail(int value) {
        stackA.push(value);
    }
    
    public int deleteHead() {
        if(stackA.isEmpty()) return -1;
        while(!stackA.isEmpty()){
            stackB.push(stackA.pop());
        }
        int num=(int)stackB.pop();
        while(!stackB.isEmpty()){
            stackA.push(stackB.pop());
        }
        return num;
    }
}

在这里插入图片描述
解法2:
    上面的解法,可以看到运行时间很长,这是因为我们不仅从A栈中取出元素给B栈,同时删除后将B栈元素又重新赋予A栈,使用了两个while循环当然速度慢。所以我们优化一下删除元素的方法,使用一个while循环,去除了把B栈放回A栈的操作。不放回A栈,不会造成影响吗?当然不会。首先,每次删除元素的时候,我们首先要判断B栈是否为空。不为空,证明B栈还有之前的元素没有删除,根据先进先出,继续删除栈顶元素即可。为空,则判断A栈是否还有元素,A栈没有元素,则返回-1。有元素,则把A栈元素继续pop出来,push到B栈删除即可。
    那这样,B栈中有元素的情况下,我往A栈又添加元素,不会造成影响吗?不会的,根据先进先出的原则,B栈有元素,则说明这些这些元素先进,当然要先删除。当B栈的这些元素删除了,为空后,又会返回到把A栈元素放回到B栈的循环中。这样就可以减少每次删除后把B栈元素重新放回A栈的冗余操作。

/**
 * Your CQueue object will be instantiated and called as such:
 * CQueue obj = new CQueue();
 * obj.appendTail(value);
 * int param_2 = obj.deleteHead();
 */
class CQueue {
    private LinkedList stackA;
    private LinkedList stackB;
    
    public CQueue() {
        stackA = new LinkedList();
        stackB = new LinkedList();
    }
    
    public void appendTail(int value) {
        stackA.push(value);
    }
    
    public int deleteHead() {
		if (stackB.isEmpty()) {
            if (stackA.isEmpty()) return -1;
            while (!stackA.isEmpty()) {
                stackB.push(stackA.pop());
            }
            return (int)stackB.pop();
        } else return (int)stackB.pop();
    }
}

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值