C++ 是否将队列转换为堆栈?

C++ 是否将队列转换为堆栈?,c++,stack,queue,C++,Stack,Queue,我有一个包含n个元素的队列,前面是0。我需要创建一个顶部为0的数字堆栈 它只能通过排队、出列、推送和弹出以及常量存储来完成。与其说我需要一个答案,不如说我需要一个如何解决这个问题的想法 请不要为我回答这个问题,但请试着理解我是编程新手,我可以用一种方法来实现这一点 这是一种类似河内塔楼的方式吗? 这是否只使用一个常量存储? 这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,把队列倒过来,然后推它,但没有成功。我甚至试着勾勒出其他情况,但都没有用。然后我想知道是不是先把他们全部排

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

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

请不要为我回答这个问题,但请试着理解我是编程新手,我可以用一种方法来实现这一点

这是一种类似河内塔楼的方式吗? 这是否只使用一个常量存储? 这不是家庭作业,我只是需要一些关于如何进行的建议。我的第一个想法是,把队列倒过来,然后推它,但没有成功。我甚至试着勾勒出其他情况,但都没有用。然后我想知道是不是先把他们全部排好,然后把他们全部排好,然后再排好,然后再推

这有效吗? 这是否使用恒定存储?
我还在学习基本的编程概念。请友善点!:

从队列中取出所有内容,立即将每个元素推送到堆栈中。现在从堆栈中弹出所有内容,立即排队。现在排队的是什么

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

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

并且,正如您所指出的,这需要在项目上传输3n=,其中n是队列的初始大小。你能做得更好吗?我不这么认为,或者至少不明显。从某种意义上说,即使没有一个计数器可以占用Olog n>O1额外的存储空间,唯一合理的做法就是将队列排入堆栈,反之亦然。

我面临的是什么? 您面临的最大问题是两个容器不能直接兼容

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

另一个问题是,在性能方面没有好的方法来反转队列。队列是单向容器,在内部,元素只需要知道行中的下一个元素,而不需要知道前一个元素。这意味着您不能从后面开始遍历队列,并且该迭代始终处于打开状态

堆栈也存在同样的问题

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

关于如何解决此问题的提示。。 您需要某种中间状态来存储您的元素,或者我们可以利用容器的后进先出(LIFO/FIFO)属性来发挥我们的优势吗

下面是一个实现,它实现了您想要的功能,如果您不想知道问题的答案,请不要将鼠标悬停在这个灰色区域上

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

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

似乎无法在扰流板内使用语法高亮显示。。 可以找到示例实现。 它利用了队列是FIFO和stack LIFO这一事实,通过将数据队列复制到堆栈,然后从堆栈复制到队列,最后从队列复制到堆栈,我们以一种与您的描述相匹配的方式有效地颠倒了元素的顺序

脚注    1. 先进先出=先进先出
   2. 后进先出(LIFO)=后进先出(Last-In-First-Out)

你能使用第二个临时堆栈吗?你说的是我的第一个想法,将队列倒过来,然后推它,但没有用。您是如何在队列上仅执行“入队列”和“出队列”操作来反转队列的?…确切地说是为什么。这是我的第一个想法,但我意识到我不能使用我今天早些时候写的反向列表方法,因为问题特别希望你只使用enque、dequeu等。所以这就是为什么它不起作用——它不是answer@caleb这会占用固定的存储空间吗?如果我能让它占据恒定的存储空间,那就好了。但我不确定常量在这个上下文中是什么意思。即使堆栈是动态创建的,我也可以使用它吗?放置在临时堆栈中的项目是否也依赖于n?请参阅我的答案,它应该为您提供足够的信息,以便您自己解决问题,否则如果您感兴趣,可以在扰流板中提供一个示例实现,并对其进行描述。向后排队。然后我可以将它们全部出列,并按所需顺序将它们推到堆栈上。这实际上是什么
我坐在这里打这个问题的时候想到了做什么。直到我写下这个问题,我才真正意识到这一点,所以我还是问了。是这样吗?虽然效率高吗?我相信它是3n的,所以它会打开并且不使用额外的存储空间?高效吗?嗯,我不认为头脑正常的人会在生产代码中做这样的事情。他/她也不会坚持你对这个问题的限制。但它是渐近线性时间。这是你能做的最好的了,谢谢!你的编辑为我澄清了这一点。我忘记了在推送之前必须存储已退出队列的节点,因为它已经需要常量存储。哦,我太高兴了,这个答案让我感觉很好的是,当我打字的时候,我在发帖之前就想到了这个问题。现在感觉好多了,我没有错想为什么是渐近线性的?它是简单的旧线性。每个元素被精确地处理三次,不管你有2个元素,200个元素,还是20亿个元素。尽管现在我很好奇,如果只给另一个初始为空的队列和恒定的存储空间,是否可以反转队列的内容。这当然是可能的,有两个堆栈可以装配在一起,以模拟一个图灵机,但两个队列?如果给您一个特殊的数据项,可以将其放入队列中,但保证最初不在队列中,您会这样做吗?但这只是一种无聊的想法。