我有一个包含n个元素的队列,前面位于0
。我需要在顶部创建一堆这些数字,其中0
。
只能通过 EnQueue , DeQueue ,推送和 Pop 以及常量存储来完成。我不需要一个答案就能知道如何解决这个问题。
请不要为我回答这个问题,但只是试着理解我是编程的新手,并且可以使用一个关于这是什么方法的想法。
这不是家庭作业,我只需要一些关于如何进行的建议。我的第一个想法是,撤消队列然后推送它不起作用。我甚至试图勾勒出其他情况而无济于事。然后我想知道是否将它们全部出列并将它们全部推出,然后将它们全部弹出并排队,然后再次出列并再次推动。
我仍然在学习基本的编程概念。请友好一点! :)
答案 0 :(得分:4)
DeQueue Queue中的所有内容,立即将每个元素推送到Stack。现在从Stack中弹出一切,立即EnQueueing到Queue。现在Queue中有什么?
假设您的队列和堆栈保持固定大小的项目,上面的 ahem 子例程当然只使用不断的额外存储:只需要存储1个项目,因为每个项目从队列转换到堆栈,反之亦然
编辑:正如您所指出的,我的子程序会反转队列的内容。完成后,将队列再次排入堆栈以获得所需结果非常简单。
而且,正如您所指出的,这需要转移3n = O(n)
个项目,其中n
是队列的初始大小。你能做得更好吗?我不相信,或者至少不是很重要。在某种意义上,即使没有计数器(需要额外存储O(log n) > O(1)
),唯一合理的做法是将队列排入堆栈,反之亦然。
答案 1 :(得分:3)
您面临的最大问题是您的两个容器彼此不直接兼容。
队列通常是FIFO 1 容器,而堆栈是LIFO 2 。这意味着您不能只是按顺序将数据从队列复制到堆栈,因为这会使元素出现在“错误”中订单(按照您的描述)。
另一个问题是没有好的方法(性能明智)来反转队列。 队列是一个单向容器,在内部元素只需知道下一个元素,而不是前一个元素。这意味着您无法从后面开始迭代队列,并且该迭代始终是 O(n)。
同样的问题出在您的堆栈。
前面描述的东西放在一起使得这个问题非常繁琐,尽管有些解决方案并不总是最直接的。
您需要某种中间状态来存储元素,还是我们可以利用容器的LIFO / FIFO属性来获得优势?
如果您不想知道问题的答案不将鼠标悬停在此灰色区域上,则下面是一个可以执行您想要的实现。
这将需要一些额外的存储空间,因为在从一个容器复制到另一个容器期间将分配额外元素的空间。这是不可避免的,尽管存储是恒定的。
请记住,可以通过在C ++ 11中使用 rvalue-references 和 move 来优化复制初始化。< / SUP>
似乎无法让语法高亮显示在扰流板内工作..
可以找到示例实现here。
它利用了队列是FIFO和堆栈 LIFO这一事实,通过将数据队列复制到堆栈,然后将堆栈复制到队列,最后队列再次堆叠我们已经以符合您描述的方式有效地颠倒了元素的顺序。
的脚注强>
1。 FIFO =先入先出
2. LIFO =后进先出