【问题标题】:copying Queue and Stack into each other将队列和堆栈相互复制
【发布时间】:2014-12-16 14:18:44
【问题描述】:

我想使用一个空栈 S 来检查队列 Q 是否包含元素 x,因此我的解决方案是将 Q 的元素复制到 S 并检查是否包含 x,但我还被要求将 S 元素返回到 Q再次和原来一样,这必须只使用 Q 和 S 而不使用任何其他 SL 数组来完成,所以我编写了这个算法:

Boolean found ← false
int element ←  0
While(Q is not empty) 

  element ← Q.dequeue()
  if(element equal x)
           found ← true
  S.push(element)

While(S is not empty)
 ( elements back to Q) ?

卡在最后一步,如果我使用 Q.enqueue(S.pop) 那么 Q 中元素的顺序将被颠倒

【问题讨论】:

    标签: java algorithm stack queue


    【解决方案1】:

    正确,顺序将被颠倒。 这意味着如果您再次重复该算法(全部到 S 并返回到 Q),您将再次反转它,这意味着您将回到元素的原始顺序,这就是您想要的。

    【讨论】:

      【解决方案2】:

      如果我使用Q.enqueue(S.pop),那么Q中元素的顺序将被颠倒

      没错,它会被颠倒过来。您可以通过观察,一旦再次运行相同的循环,您将获得原始订单,从而发挥您的优势。

      如果您创建一个执行搜索的方法并使队列处于反转状态,您可以避免两次编写相同的循环。您可以调用您的搜索方法两次,并忽略第二个返回值。

      【讨论】:

        【解决方案3】:

        这感觉像是一个硬件问题,所以我不会为你解决它,但我会给你一个提示 - 当你将队列出列到堆栈中然后将堆栈出列返回队列时会发生什么?

        你如何利用这种现象来恢复原来的队列?

        【讨论】:

        • 我会将 S 中的元素弹出到 Q 中,它们将被反转,然后我将再次出列到 S 中,然后将它们弹出到 Q 中,现在它们将按正确的顺序排列,谢谢您的提示。
        【解决方案4】:

        我不确定 java 默认队列是如何工作的。

        1. 从队列末尾移除元素。
        2. 检查该元素是否为 x,如果是则返回 true。
        3. 否则,将其压入堆栈
        4. 重复直到找到 x 或所有队列为空。
        5. 完成后,每次从堆栈中逐个弹出元素并将它们添加到队列的开头,堆栈中的最后一个元素将成为队列中的第一个元素。这样你就可以维持秩序。

        【讨论】:

        • "从栈中一个一个地弹出元素,并添加到队列的开头" 如果是双端队列,那怎么做就没有问题了。
        • 当我以前在java中使用队列和堆栈时,我有自己的实现。我不确定他是使用 java 中预定义的还是他自己的,他可以在其中轻松添加尾部。
        猜你喜欢
        • 2015-07-04
        • 2018-09-20
        • 1970-01-01
        • 2013-09-18
        • 1970-01-01
        • 2014-07-21
        • 2015-11-16
        • 2019-03-07
        • 2021-04-29
        相关资源
        最近更新 更多