algorithm - 如何使用两个堆栈实现队列?

标签 algorithm data-structures stack queue

假设我们有两个堆栈并且没有其他临时变量。

是否可以仅使用两个堆栈来“构建”队列数据结构?

最佳答案

保留 2 个堆栈,我们称它们为 inboxoutbox

排队:

  • 将新元素推送到收件箱

出列:

  • 如果 outbox 为空,则通过从 inbox 弹出每个元素并将其插入 outbox 来重新填充它

    /li>
  • outbox

    弹出并返回顶部元素

使用此方法,每个元素将在每个堆栈中恰好出现一次 - 这意味着每个元素将被压入两次并弹出两次,从而提供摊销的常量时间操作。

这是 Java 中的一个实现:

public class Queue<E>
{

    private Stack<E> inbox = new Stack<E>();
    private Stack<E> outbox = new Stack<E>();

    public void queue(E item) {
        inbox.push(item);
    }

    public E dequeue() {
        if (outbox.isEmpty()) {
            while (!inbox.isEmpty()) {
               outbox.push(inbox.pop());
            }
        }
        return outbox.pop();
    }

}

关于algorithm - 如何使用两个堆栈实现队列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69192/

相关文章:

algorithm - 使用堆排序,追加数组元素

algorithm - 弗洛伊德算法解释

javascript - 检查用户是否分配给特定插槽

堆栈对象的 C++ 继承

algorithm - 朴素的 LFSR,将编程语言翻译成数学

c++ - 如何通过检查字典查找删除空格的短语中的单词数

data-structures - Heap 数据结构的准确定义是什么?

algorithm - 跟踪堆内的节点

java - 有没有类似copyonwritearraylist的copyonwritestack?

swift - IOS清除多个 View Controller 的快速导航堆栈