【剑指Offer】用两个栈实现队列 题目描述

用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

栈和队列

解题前我们先来了解下什么是栈和队列
栈是限制插入和删除只能在一个位置上进行的表,是后进先出表,比如,在栈中依次插入1,2,3,4(由栈顶插入),如下图所示。由于栈是限制只能在一个位置上进行操作,所以删除(弹出)也只能在栈顶进行,即弹出顺序为4,3,2,1。正好是最后插入4的最先弹出,最先插入的1最后弹出。
【剑指Offer】用两个栈实现队列
题目描述

队列是插入在一端进行而删除在另一端进行的表,是先进先出表,比如依次在队列中插入1,2,3,4(这里是从队尾插入)。如下图所示。由于删除只能在另一端即队头(队首)进行,所以出队顺序为1,2,3,4。可以看到最先入队的1是最先出队,最后入队的4也是最后出队。
【剑指Offer】用两个栈实现队列
题目描述

解法

题目要求是用两个栈来模拟一个队列。栈的特性是后进先出,队列的特性是先进先出,可以发现他们的顺序刚好是相反的。那么自然就想到相反的相反的就是对的顺序了。举个例子,仍然是往栈A中依次插入1,2,3,4,此时它的弹出顺序是4,3,2,1。若再将这个弹出顺序4,3,2,1,依次插入到栈B中,此时栈B的弹出顺序就是1,2,3,4,对于最开始插入的1,2,3,4序列刚好满足了先进先出的特性。

实现代码

using System.Collections.Generic;
class Solution
{
    Stack<int> pushStack = new Stack<int>();
    Stack<int> popStack = new Stack<int>();
    // 入队
    public void push(int node) 
    {
        pushStack.Push(node);
    }
    // 出队
    public int pop() 
    {
        if (popStack.Count <= 0)
        {
            while(pushStack.Count > 0)
            {
            	// 在出队时,先将pushStack中元素依次弹出并插入到popStack中
                popStack.Push(pushStack.Pop());
            }
        }
        // 再通过popStack弹出
        return popStack.Pop();
    }
}


更多题目的完整描述,AC代码,以及解题思路请参考这里https://github.com/iwiniwin/Algorithm