标签:
题目:如何用两个栈模拟实现一个队列? 如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证的队列容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间)
分析:栈的特点是“后进先出(LIFO)”,而队列的特点是“先进先出(FIFO)”。用两个栈模拟实现一个队列的基本思路是:用一个栈作为存储空间,另一个栈作为输出缓冲区,把元素按顺序压入两栈(模拟的队列),并按此顺序出队并输出即可。
如下图,用容量为m的栈作为存储空间,容量为n的栈作为输出缓冲区,一开始先将n个元素压入(push)存储空间m
随后对存储空间m中的每个元素进行出栈(pop)操作,继而压入(push)输出缓冲区n,如下图所示
再向存储空间m中压入(push)n+1个元素,两个栈的状态如下图:
此时将输出缓冲区n中的元素出栈(pop)并输出:Q1,Q2,......,Qn,再对存储空间m中的n个元素进行出栈(pop)并压入输入缓冲区,状态图如下:
对存储空间m进行一次出栈(pop)操作并输出:Qn+1,最后再对输出缓冲区n中的所有元素进行出栈操作并输出Qn+2,Qn+3,......,Q2n,Q2n+1。
综上所述,两个栈总的输出序列为:Q1,Q2,......,Qn,Qn+1,Qn+2,Qn+3,......,Q2n,Q2n+1。符合队列“先进先出”的特性,模拟成功。
通过以上分析很易知,所模拟队列的最大容量为2n+1。
标签:
原文地址:http://www.cnblogs.com/eniac12/p/4865158.html