确定堆栈/队列大小的调用次数

时间:2016-03-17 11:22:09

标签: python python-3.x

问题1

您有一个带有 n 条目的抽象堆栈和一个空的抽象队列(帮助)。确定 n 需要多少次电话?之后堆栈需要保持不变。

问题2

同样的问题,但你从一个abstrack队列开始,并有一个空的abstrack堆栈。

我的推理

从堆栈弹出 - >推进队列 - >从队列中获取 - >放在堆栈上 - >从堆栈弹出 - >推进队列 - >从队列中获取 - >放在堆栈上。在某个地方我们扔进一个计数器,这使它成为8 * n次调用(如果计数器调用计数则为9 * n)。我不知道如何从堆栈中弹出项目,然后以正确的顺序将它们恢复。 有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

Q1。更好的解决方案可能是:

  1. pop
  2. 入队
  3. 出队
  4. 通过这样做,你可以获得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。我认为现在可以使用先前案例的相同(非最优)算法......

    主要思想是当你从堆栈中获取一个项目时,这将是队列的最后一个,因为这两个数据结构具有不同的输入方式。

    希望这可以帮助你: - )