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


    题目描述

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

    栈和队列

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

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

    解法

    题目要求是用两个栈来模拟一个队列。栈的特性是后进先出,队列的特性是先进先出,可以发现他们的顺序刚好是相反的。那么自然就想到相反的相反的就是对的顺序了。举个例子,仍然是往栈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
  • 相关阅读:
    继续无题
    关于自杀的一些观点
    详解js运算符
    数据库批量 之 Oracle
    数据库批量 之 DB2
    linux压缩(解压缩)命令详解
    Cron
    解压命令
    常见web错误码
    cmd命令大全
  • 原文地址:https://www.cnblogs.com/iwiniwin/p/10793651.html
Copyright © 2020-2023  润新知