使用两个队列实现栈

栈是先进后出,队列先进先出,问题在于如何在队列中找到最后一个进队列的元素。好在有两个队列。从一个队列往另外一个队列里面转移数据,转移到剩余一个的时候,就弹出该元素。压入栈比较简单,向正在使用的队列里面插入一个元素就可以了。

入栈的时间复杂度和普通的栈一致 ,但是出栈就是要把装有数据的队列操作一遍,复杂度是 ,其中 是队列中元素的个数。

下面是 C# 实现代码:

public class StackWith2Queues<T>
{
    private Queue<T> curQueue;
    private Queue<T> otherQueue;

    public StackWith2Queues()
    {
        curQueue = new Queue<T>();
        otherQueue = new Queue<T>();
    }

    public int Count { get; private set; }

    public bool Empty { get { return Count == 0; } }

    public void Push(T item)
    {
        curQueue.Enqueue(item);
        Count++;
    }

    public T Peek()
    {
        if (Empty)
        {
            throw new InvalidOperationException();
        }
        else
        {
            while (curQueue.Count > 1)
            {
                otherQueue.Enqueue(curQueue.Dequeue());
            }

            T result = curQueue.Dequeue();
            otherQueue.Enqueue(result);
            SwapQueue();
            return result;
        }
    }

    public T Pop()
    {
        if (Empty)
        {
            throw new InvalidOperationException();
        }
        else
        {
            Count--;
            while (curQueue.Count > 1)
            {
                otherQueue.Enqueue(curQueue.Dequeue());
            }

            T result = curQueue.Dequeue();
            SwapQueue();
            return result;
        }
    }

    private void SwapQueue()
    {
        var tmp = curQueue;
        curQueue = otherQueue;
        otherQueue = tmp;
    }
}