当前位置: 首页 > 知识库问答 >
问题:

将队列转换为堆栈?

梁鸣
2023-03-14

我有一个包含n个元素的队列,前面是0。我需要创建一个堆栈,上面有0

它只能通过排队、退队、推送和弹出以及持续存储来完成。与其说我需要一个答案,不如说我需要一个如何解决这个问题的想法。

请不要为我回答这个问题,但是请试着理解我是编程新手,我可以用一个想法来解决这个问题。

  • 这是一种类似河内塔楼的方式吗
  • 这只需要一个恒定的存储空间吗

这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,倒转队列,然后推它,但没有成功。我甚至试着勾勒出其他情况,但都无济于事。然后我想知道是不是把他们都排出来推,然后把他们都排出来,然后再排出来推。

  • 这有效吗
  • 这需要恒定的存储吗

我还在学习编程的基本概念。请友善点!:)

共有2个答案

秦斌
2023-03-14

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

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

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

堆栈也存在同样的问题。

前面所描述的事情加在一起使这个问题变得相当乏味,尽管有些解决方案并不总是最直接的。

你需要某种中间状态来存储你的元素,或者我们可以利用容器的后进先出特性来发挥我们的优势吗?

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

它将需要一些额外的存储空间,因为在从一个容器复制到另一个容器的过程中,将为额外的元素分配空间...这是不可避免的,尽管存储是不变的。

记住,拷贝初始化可以通过使用右值引用和在C 11中移动来优化


示例实现可以在这里找到。它利用了队列是先进先出和堆栈LIFO的事实,通过将数据队列复制到堆栈,然后堆栈到队列,最后再次队列到堆栈,我们以符合您描述的方式有效地颠倒了元素的顺序。

脚注

陶唯
2023-03-14

从队列中删除所有内容,立即将每个元素推送到堆栈。现在弹出堆栈中的所有内容,立即进入队列。队列中现在有什么?

假定您的队列和堆栈容纳固定大小的项目,上述ahem子例程当然只使用恒定的额外存储:当每个项目从队列转移到堆栈时,只需要存储1个项目,反之亦然。

编辑:正如您所指出的,我的子例程反转队列的内容。这样做之后,将队列再次排入堆栈以获得所需结果就相当简单了。

正如您所指出的,这需要传输3n=O(n)项,其中n是队列的初始大小。你能做得更好吗?我不这么认为,或者至少不明显。在某种意义上,甚至没有计数器(需要O(logn)

 类似资料:
  • 问题内容: 将a 转换为同时保持Queue顺序的最快方法是什么? 问题答案: 最快的方法是首先使用LinkedList,它可用作列表或队列。 否则您需要复印 注意:处理PriorityQueue时,请使用循环,轮询每个元素并添加到列表中。要列出的PriorityQueue不维护堆顺序。

  • 我知道我们可以使用collections.reverseOrder()创建一个使用优先级队列的max堆,但是我还需要在那个地方传递ArrayList。我试图创建一个自定义比较器以防万一,但它似乎不起作用。我想知道这样做的确切语法。 示例/我的知识: 1)创建一个空的最小堆->PriorityQueue pqmin=new PriorityQueue(); 2)从一个ArrayList创建一个最小堆

  • 这段代码有两个问题: explext强制转换; 我想知道是否有一行的解决方案。 那么我们有没有更优雅的方法来做到这一点呢? 队列是否反向并不重要。我需要一个反转元素的int数组。

  • 我是数据科学的初学者,我正在尝试使用Pandas来旋转此数据框架: 所以它变成这样:(标签应该变成列,文件路径变成行。) “标签”列是一组或一类文件路径。我想把它转换成这样一种方式,它适合这个函数:tf。Keras.preprocessing.image.flow_from_dataframe 提前感谢所有帮助我的人。

  • 数字键盘字母组合问题[M]

  • 我一直在通过互联网进行广泛的搜索,寻找某种类型的答案来解决我的问题,但我没有运气找到任何可以帮助我的东西。基本上,我想知道的是是否可以将双精度转换为密钥,然后将其插入到优先级队列中。 这就是我正在努力使用的方法,它来自一个文件名。就是这个: 文件中的 insert 方法如下所示: 这是的插入方法.java 它们是相同的。现在问题出现了,因为来自.java不能更改。我必须接受一个双精度,然后将该双精