将队列转换为堆栈?

我有一个队列中有n个元素,前面是0 。 我需要在顶部创建一个0的堆栈。

它只能通过EnQueue,DeQueue,Push和Pop以及常量存储来完成。 我不需要一个答案,就像我可以如何解决这个问题一样。

请不要为我回答这个问题,但是试着去了解我在编程方面的新知识,并且可以仅仅用一个想法来说明这可以做什么。

  • 这是一种类似河内的方法吗?
  • 这是否只使用恒定的存储空间?
  • 这不是作业,我只需要一些关于如何进行的建议。 我的第一个想法,扭转队列,然后推它不起作用。 我甚至试图勾画出其他情况并无济于事。 然后我想知道是否将所有队列出队并推送出去,然后将它们全部弹出并排队,然后再次出队并推送。

  • 这是否有效?
  • 这是否使用恒定的存储?
  • 我仍然在学习基本的编程概念。 请友好一点! :)


    我在面对什么?

    您面临的最大问题是您的两个容器不能直接兼容。

    队列通常是FIFO1容器,而堆栈是LIFO2。 这意味着您不能将数据按顺序从队列中复制到堆栈中,因为这会使元素以“错误”的顺序出现(在您的描述之后)。

    另一个问题是没有好的方法(性能明智)来扭转队列。 队列是单向容器,内部元素只需要知道下一个元素,而不是前一个元素。 这意味着您不能从后面开始遍历队列,并且该迭代总是O(n)。

    同样的问题是你的堆栈。

    前面所描述的事情使得这个问题非常乏味,尽管有些解决方案并不总是最直接的。


    提示如何解决这个问题..

    您需要某种中间状态来存储您的元素,或者我们可以使用集装箱的LIFO / FIFO属性来获得我们的优势吗?

    下面是一个实现你想要的东西,如果你不想知道你的问题的答案,不要用鼠标悬停在这个灰色区域。

    这将需要一些额外的存储空间,因为在从一个容器复制到另一个容器期间,额外元素的空间将被分配。尽管存储是恒定的,但这是不可避免的

    请记住,可以通过使用右值引用并在C ++ 11中移动来优化复制初始化。

    似乎无法得到语法高亮工作在剧透里面..

    示例实现可以在这里找到。

    它利用了一个事实,即一个队列是FIFO和堆栈LIFO,通过将数据队列复制到堆栈,然后堆栈到队列并最终再次队列堆栈,我们有效地以与您的描述相匹配的方式反转元素的顺序。


    脚注
    1. FIFO =先进先出
    2. LIFO =后进先出


    DeQueue Queue中的所有内容立即将每个元素推送到Stack。 现在,从Stack中弹出所有内容,立即启动EnQueueing队列。 队列中有什么?

    假定队列和堆栈保存固定大小的项目,上面的ahem子例程当然只使用常量附加存储:每个项目从队列转换为堆栈或反之亦然,因此只需存储1个项目。

    编辑 :正如你指出的,我的子程序颠倒队列的内容。 这样做后,再次将Queue排入堆栈以获得理想的结果相当简单。

    而且,正如您指出的那样,这需要传输3n = O(n)项目,其中n是队列的初始大小。 你能做得更好吗? 我不这么认为,或者至少不是很重要。 在某种意义上,即使没有计数器(这会占用O(log n) > O(1)额外的存储空间),唯一合理的做法是将队列排入堆栈,反之亦然。

    链接地址: http://www.djcxy.com/p/79859.html

    上一篇: Convert a queue to the stack?

    下一篇: Stack with find