当前位置: 首页 > 知识库问答 >
问题:

使用k堆栈对堆栈进行排序,但不能推回原始堆栈

姚才捷
2023-03-14

输入k=堆栈数

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

但是你只能弹出输入,你不能推到它。输出也是另一个堆栈,你可以返回并推到它,但不能弹出

所以如果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

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

但是,肯定存在某些具有解决方案的排序,并且它们可能具有不同的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***

但是我们应该推到哪一层呢?就是我被困的地方。如果你能回到in,这个问题将非常容易。

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

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


共有1个答案

吕钧
2023-03-14

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

  • 将原始元素中的每个元素弹出到s1中
  • 从原始s1中弹出每个元素,并将其推入s2
    • 对于每个经过的元素,保留较小的元素,在找到另一个较小的元素之前不要推它
    • 最后你得到了较小的一个,所以把它推到r上

    所以看起来应该是:

    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才能解决

 类似资料:
  • 有3个堆栈-A、B、C 堆栈A和B被排序(堆栈顶部的数字最大)。堆栈C为空,仅允许5次操作: 推,弹出,顶,is_empty,创建 我们需要编写一个函数来接收堆栈A和B,将堆栈A和B中的所有数字移动到堆栈C,堆栈C必须排序(最大数字在顶部)。 我有算法: 比较A的顶部和B的顶部 我开始写代码,但有错误,我不知道为什么! 代码:

  • 我试图理解使用中给出的递归对堆栈元素进行排序http://www.geeksforgeeks.org/sort-a-stack-using-recursion/不允许使用while、for…等任何循环结构。我们只能在堆栈S上使用以下ADT函数: is_empty(S):测试堆栈是否为空。 push(S) :向堆栈添加新元素。 Pop(S):从堆栈中删除顶部元素。 top(S) :返回 top 元素

  • 在这个程序中,我必须打开一个文件并将其打印到文本区域,然后确保所有括号、括号等匹配。如果括号匹配,我将在另一个文本区域中打印出来。我的问题如下:我是从文件中读取还是从第一个文本区域读取?我是在Actionlistener还是在构造函数中创建堆栈?

  • 给定一个堆栈,任务是对它进行排序,使堆栈的顶部具有最大的元素。 示例1: 输入:堆栈:3 2 1输出:3 2 1示例2: 输入:堆栈:11 2 32 3 41输出:41 32 11 3 2 您的任务: 预期时间复杂度:O(N*N)预期辅助空间:O(N)递归。 约束:1

  • 我已经在Java和C中找到了这个问题的几个实现,但我还没有找到一个使用JavaScript的示例。这是一个相当常见的技术面试问题: 在2n空间中对堆栈进行排序。(仅使用2个堆栈对堆栈进行排序)

  • 我有一个执行快速排序的应用程序。在我开始给它一些更大的数字(我第一次得到它是10000000)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码: