将队列转换为堆栈?
我有一个队列中有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)
额外的存储空间),唯一合理的做法是将队列排入堆栈,反之亦然。
上一篇: Convert a queue to the stack?
下一篇: Stack with find