• 用两个栈模拟实现一个队列


      题目:如何用两个栈模拟实现一个队列?  如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证队列的最大容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间)

      分析:栈的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”。用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,入队时把元素按顺序压入两栈模拟的队列,出队时按入队的顺序出栈即可

         如下图,用容量为m(较大的)的栈作为存储空间,容量为n的栈作为输出缓冲区,先将入队的前n个元素push进存储空间栈

                  

       随后对存储空间栈中的每个元素进行出栈(pop)操作,继而压入(push)输出缓冲区栈,如下图所示

                    

       对于剩余入队的前n+1个元素,将他们压入存储空间栈,两个栈的状态如下图:

                    

       此时已经入队了2n+1个元素,若此时进行出队操作,先将输出缓冲区栈中的元素出栈(pop)并输出:Q1,Q2,......,Qn,再对存储空间栈中的n个元素进行出栈(pop)并压入输入缓冲区栈,状态图如下:

                    

       然后对存储空间栈进行一次出栈(pop)操作并输出:Qn+1,最后再对输出缓冲区栈中的所有元素进行出栈(pop)操作并输出Qn+2,Qn+3,......,Q2n,Q2n+1。这样两个栈总的输出序列为:Q1,Q2,......,Qn,Qn+1,Qn+2,Qn+3,......,Q2n,Q2n+1符合队列“先进先出”的特性,模拟成功。

         但是如果前面蓝字的假设不成立,即在已经入队了2n+1个元素的情况下,还要继续向队列中添加更多的元素,将无法满足按入队的顺序出队。

       综上所述,两个栈所模拟的队列的最大容量为2n+1

  • 相关阅读:
    Python 流媒体播放器(基于VLC)转载
    从2011年用工荒现象看中国人口结构的周期波动
    软件供应链安全现状分析
    vue中this.$nextTick()的用法
    C#中几种数据格式保存xls(DataTable 和List 保存xls) DataGridView转DataTable
    element 报错:Unexpected reserved word 'await'
    C# winfrm程序的主入口捕获项目的全部异常
    利用C#怎么获取 List集合中的重复值Linq操作
    cesium 自定义时间轴 通过改变时间设置光照效果[转]
    CESIUM 原理 之 COMMAND拼接【转】
  • 原文地址:https://www.cnblogs.com/eniac12/p/4865158.html
Copyright © 2020-2023  润新知