使用两个栈实现队列
栈是先进后出,队列是先进先出。考虑把栈 A 的数据弹出再压入栈 B 中,顺序就完全反过来了,如果再把 B 中的元素弹出,就按照进栈 A 的顺序了。此题解题思路大致如此。进队列的时间复杂度就是压入栈 A 的时间复杂度 ,出栈的话,如果栈 B 有数据,也是 ,但是没有数据,对于当次操作而言是 ,其中 为栈 A 中的元素个数,但是平摊分析一下,每个元素进栈 A,倒到栈 B,然后出栈,所以平均时间复杂度是 。
下面是C#代码:
public class QueueWith2Stacks<T>
{
private Stack<T> enqueueStack;
private Stack<T> dequeueStack;
public QueueWith2Stacks()
{
enqueueStack = new Stack<T>();
dequeueStack = new Stack<T>();
}
public int Count { get; private set; }
public bool Empty { get { return Count == 0; } }
public void Enqueue(T item)
{
enqueueStack.Push(item);
Count++;
}
public T Peek()
{
if (Empty)
{
throw new InvalidOperationException();
}
else
{
if (dequeueStack.Count == 0)
{
EnqueueToDequeue();
}
return dequeueStack.Peek();
}
}
public T Dequeue()
{
if (Empty)
{
throw new InvalidOperationException();
}
else
{
Count--;
if (dequeueStack.Count==0)
{
EnqueueToDequeue();
}
return dequeueStack.Pop();
}
}
private void EnqueueToDequeue()
{
while (enqueueStack.Count>0)
{
dequeueStack.Push(enqueueStack.Pop());
}
}
}