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

被折叠的 条评论
为什么被折叠?



