java两个栈实现一个队列

本文介绍了一种使用两个栈来实现队列的方法。通过切换栈的角色完成队列的基本操作:入队(push)和出队(pop)。为了确保线程安全,在进行入队和出队操作时使用了同步机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个栈实现一个队列

public class Queue {

    /**
     * 出队栈
     */
    private Stack<Object> mPop = new Stack<>();
    /**
     * 入队栈
     */
    private Stack<Object> mPush = new Stack<>();
    /**
     * 锁对象,防止push或者pop操作时mPop或者mPush被修改
     */
    private String mLock = "mLock";

    /**
     * 入队操作
     * @param value
     */
    public void push(Object value) {
        // 将元素压入队列
        synchronized (mLock) {
            mPush.push(value);
        }
    }

    public Object pop() {
        synchronized (mLock) {
            // 需要弹出队列的元素
            Object target = null;
            // 先将已入栈的元素反序压入到管理出队的栈中
            while (!mPush.isEmpty()) {
                Object value = mPush.pop();
                mPop.push(value);
            }
            // 从 出队栈 中pop出一个元素
            target = mPop.pop();
            // 因为已经pop了一个元素,所以需要去掉 入队栈 的栈底对象
            // 先清空 入队栈
            mPush.clear();
            // 将 出队栈 所有元素压入 入队栈
            while (!mPop.isEmpty()) {
                Object value = mPop.pop();
                mPush.push(value);
            }
            // 返回队列pop的元素
            return target;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值