摊销分析:具有两个堆栈的FIFO

时间:2010-11-09 22:41:23

标签: data-structures queue fifo

如何使用两个堆栈实现FIFO队列,以便每个FIFO操作都按照摊销的常量时间进行?

2 个答案:

答案 0 :(得分:1)

冒着给出完整答案的风险(我希望练习是编写代码,而不仅仅是给出这个答案)......

按下一个进入队列,弹出另一个进行轮询。当输出堆栈为空时,将所有项目从输入堆栈逐个移动到输出堆栈。

答案 1 :(得分:0)

类似的东西:

template <class T>
class FIFO
{
  stack<T> myStack;
  stack<T> myStackReversed;

 public:

  void enqueue(T data);
  T    dequeue();
};

template <class T>
void FIFO<T>::enqueue(T data)
{
  myStack.push(data);
}

template <class T>
T FIFO<T>::dequeue()
{
  if (myStackReversed.size() == 0)
  {
    int size = myStack.size();
    for (int i=0; i<size; i++)
    {
      myStackReversed.push(myStack.top());
      myStack.pop();
    }
  }

  T ret = myStackReversed.top();
  myStackReversed.pop();

  return ret;
}