使用k堆栈对堆栈进行排序,但无法将其推回原始堆栈

时间:2018-02-22 08:14:49

标签: algorithm sorting stack

输入k =堆栈数

input = 5, 3, 4, 1, 2
output should be  = 5, 4, 3, 2, 1

但是你只能弹出输入,无法推送output也是另一个堆栈,您可以返回并推送但无法弹出

所以如果k = 1

in = 5, 3, 4, 1, 2  k = (),     out = ()
in = 3, 4, 1, 2     k = 5       out = ()
in = 4, 1, 2        k = 5,3     out = ()
in = 1, 2           k = 5,3,4   out = ()
in = 2              k = 5,3,4   out = 1 // since you know 1 must go first
in = ()             k = 5,3,4   out = 1,2

由于您无法回到in,因此没有解决方案,您必须报告。

然而,肯定存在某些具有解决方案的排序,并且可能具有不同的k值。例如,如果k = 2并且有两个堆栈,上面的输入顺序是否可以解决?

我怎么知道要推送哪个堆栈?

我的思维过程是

1. pop input
2. pop all k stacks
3. see if any popped values == target, starting with 1 and incrementing
4. if they do == target, push to out
5. if in != target, push to stack k***

但我们应该推送哪个堆栈?是我被困住的地方。如果你可以回过头来,这个问题就非常容易了。

这听起来像一个河内式问题的塔,但我不确定。我觉得有一种解决这个问题的数学方法。有什么想法吗?

编辑:我的另一个直觉是,河内的塔有一个限制,你不能在较小的一个上面放一个更大的钉子。这也是有道理的,因为说k = 1,这个问题基本上是一个河内问题的塔,除了磁盘最初不遵守规则,但应该遵守规则,如果解决方案是可能的...

1 个答案:

答案 0 :(得分:0)

您可以使用两个辅助堆栈,s1,s2:

  1. 将原始元素中的每个元素弹出到s1
  2. 弹出原始s1中的每个元素并将其推入s2
    • 对于每个传递元素,保留较小的元素,不要推它直到找到另一个较小的元素
    • 最后你得到了较小的一个,所以把它推到r
  3. 现在重复步骤2,将s1替换为s2,反之,直到没有元素
  4. 所以看起来应该是这样的:

    fill(s1,o) // step 1
    u = s1, v = s2
    repeat
        e = less(v,u) // step 2
        push(r,e)
        swap(u,v)
    until empty(u)        
    

    似乎无法移除一个辅助堆栈。我认为这个问题只能解决k> = 2。

相关问题