剑指 Offer 09 用两个栈实现队列

起初读题一直没明白题的意思,在题解中看到了白话文解释才明白。

应该考察栈(先进后出)、队列(先进先出)的特性。

这里2个栈,我的理解为,第一个为功能栈,第二个为辅助栈,根据栈先进后出的特点,用两个栈来实现队列的功能。

个人总结就是,首先数字压入第一个栈,此时栈1为空,栈2为空,比如依次进入 1、3、5 三个数字,此时栈1、栈2如图所示

如果此时想要删除头元素,也就是第一个进入的数字:1,那么就需要把栈1的三个元素,依次弹出(pop),压入栈2(push)中,此时栈1为空,栈2不为空,根据先进后出的原则,栈2变为如图所示

            

然后把1弹出(pop),这样就可以实现头元素的删除

因此,如果是实现添加元素,那么所有元素首先压入栈1

那么删除元素就要考虑栈2的情况,因为要想实现删除头元素,必须是栈1元素先弹出,然后压入栈2,此时栈2不为空,说明元素都在栈2,删除操作可以直接依次执行,也就不需要另加考虑。

根据题意,如果栈1、2均为空,删除操作返回-1

再考虑栈1、栈2的情况

①、栈2为空、栈1不为空

这种情况也就是栈1压入了新元素,此时栈1、栈2情况如图

那么此时的头元素就变成了7,要想删除7,首先要把栈2元素弹出压入栈1,再把栈1元素弹出压入栈2,那么7就在栈2的顶部,就可以实现删除操作了。

栈2元素依次弹出压入栈1:

栈1元素依次弹出压入栈2:

②、栈1为空、栈2不为空

直接弹出栈2栈顶元素,进行删除即可

至此个人思路题解结束,根据思路写出代码

class CQueue {
    
    private Stack<Integer> stack1;
    private Stack<Integer> stack2;

    public CQueue() {
        stack1 = new Stack<>();
        stack2 = new Stack<>();
    }
    
    public void appendTail(int value) {
        stack1.push(value);
    }

    public int deleteHead() {
        // 栈2为空
        if (stack2.isEmpty()) {
            //栈2为空、栈1不为空
            while (!stack1.isEmpty()) {
                stack2.push(stack1.pop());
            }
        }
        //栈2空、栈1空
        if (stack2.isEmpty()) {
            return -1;
        } else { //栈2不空
            return stack2.pop();
        }
    }
}

isEmpty() 判断是否为空,如果栈是空的,则返回true,如果栈中含有元素,则返回false

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值