问题1
您有一个带有 n 条目的抽象堆栈和一个空的抽象队列(帮助)。确定 n 需要多少次电话?之后堆栈需要保持不变。
问题2
同样的问题,但你从一个abstrack队列开始,并有一个空的abstrack堆栈。
我的推理
从堆栈弹出 - >推进队列 - >从队列中获取 - >放在堆栈上 - >从堆栈弹出 - >推进队列 - >从队列中获取 - >放在堆栈上。在某个地方我们扔进一个计数器,这使它成为8 * n次调用(如果计数器调用计数则为9 * n)。我不知道如何从堆栈中弹出项目,然后以正确的顺序将它们恢复。 有更好的方法吗?
答案 0 :(得分:0)
Q1。更好的解决方案可能是:
通过这样做,你可以获得4 * n次操作。
例如,让我们堆叠:1,2,3(顶部为1)
让我们成为堆栈,然后是队列。
q.enqueue(s.pop()),所以现在s = [2,3]和q = [1]
q.enqueue(s.pop()),所以现在s = [3]和q = [1,2]
q.enqueue(s.pop()),所以现在s = []和q = [1,2,3]
s.push(q.dequeue()),现在s = [1]和q = [2,3]
s.push(q.dequeue()),所以现在s = [2,1]和q = [3]
s.push(q.dequeue()),所以现在s = [3,2,1]和q = []
q.enqueue(s.pop()),所以现在s = [2,1]和q = [3]
q.enqueue(s.pop()),所以现在s = [1]和q = [3,2]
q.enqueue(s.pop()),所以现在s = []和q = [3,2,1]
s.push(q.dequeue()),所以现在s = [3]和q = [2,1]
s.push(q.dequeue()),现在s = [2,3]和q = [1]
s.push(q.dequeue()),所以现在s = [1,2,3]和q = []
我不认为这可能是最好的解决方案,但是更好的解决方案(9 * n vs 4 * n,总是O(n))
Q2。我认为现在可以使用先前案例的相同(非最优)算法......
主要思想是当你从堆栈中获取一个项目时,这将是队列的最后一个,因为这两个数据结构具有不同的输入方式。
希望这可以帮助你: - )