输入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,这个问题基本上是河内塔的问题,除了磁盘最初不遵守规则,但如果有可能解决方案,应该遵守规则...
您可以使用两个辅助堆栈,s1,s2:
所以看起来应该是:
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)之前,它工作得很好。我知道是由递归引起的,但我不明白为什么我的应用程序会因此而崩溃。如有任何建议,将不胜感激。这是我的密码: