剑指 offer09. 用两个栈实现队列

题目:剑指 offer09. 用两个栈实现队列

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

栈的基本用法:

方法功能
Stack()构造一个空的栈
E push(E e)将e压入栈,并返回e
E pop()弹出栈顶元素并返回
E peek()获取栈顶元素
int size()获取栈的大小
boolean isEmpty()判断栈是否为空

思路:

栈是先进后出的线性数据结构,只能对栈顶进行操作,所以在一个栈的情况下是无法实现删除队列头部,也就是栈底元素的。但是,在另一个栈的帮助下就可以实现了,如果需要删除栈底元素,就可以把a栈的元素一个一个弹出,压入b栈中,最后再把b栈中的栈顶元素弹出,然后实现删除a栈中的栈底元素。

java代码:

class CQueue {
    
    /**
     * 定义栈a和栈b
     */
    Stack<Integer> a, b;

    public CQueue() {
        a = new Stack<>();
        b = new Stack<>();
    }

    /**
     * 在队列尾结点加入值,只需要将值压入栈中即可
     */
    public void appendTail(int value) {
        a.push(value);
    }

    /**
     * 删除队列头元素,需要先将栈a的值弹出并存到栈b中,然后再弹出栈b的栈顶元素
     * 注意: 当栈b不为空时,就算栈a压入新的元素栈b都不会加入新元素,会等栈b将所有元素弹出时,
     * 才会重新压入新的元素,如果没有新元素压入,就会返回-1
     */
    public int deleteHead() {
        if (!b.isEmpty()) {
            return b.pop();
        }
        if (a.isEmpty()) {
            return -1;
        }

        while (!a.isEmpty()) {
            b.push(a.pop());
        }

        return b.pop();
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值