【剑指Offer】用两个栈实现队列

题目描述

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

栈和队列

解题前咱们先来了解下什么是栈和队列
栈是限制插入和删除只能在一个位置上进行的表,是后进先出表,好比,在栈中依次插入1,2,3,4(由栈顶插入),以下图所示。因为栈是限制只能在一个位置上进行操做,因此删除(弹出)也只能在栈顶进行,即弹出顺序为4,3,2,1。正好是最后插入4的最早弹出,最早插入的1最后弹出。
栈web

队列是插入在一端进行而删除在另外一端进行的表,是先进先出表,好比依次在队列中插入1,2,3,4(这里是从队尾插入)。以下图所示。因为删除只能在另外一端即队头(队首)进行,因此出队顺序为1,2,3,4。能够看到最早入队的1是最早出队,最后入队的4也是最后出队。
队列svg

解法

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

实现代码

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();
    }
}
相关文章
相关标签/搜索