如何使用优先级队列实现堆栈?

Alg*_*ist 11 algorithm

如何使用优先级队列实现堆栈?

伙计这是一个面向软件工程师/开发人员微软面试问题.我只是无法弄清楚问题的含义.所以我很好地发现了这个问题:

可以将堆栈和队列建模为特定类型的优先级队列.在堆栈中,每个插入元素的优先级是单调递增的; 因此,插入的最后一个元素始终是第一个检索的元素.

所以这个问题要我们做什么.作为堆栈(纠正我,如果错了)隐式实现为优先级队列(优先级随着元素的增加而单调递增).

有没有人可以弄清楚这个问题的含义.在面试中提出这类问题时我们应该做什么.

Fre*_*Foo 20

伪代码:

// stack of Key
class Stack {
    class Element { int prio, Key elem; };
    MaxPriorityQueue<Element> q;
    int top_priority = 0;

    void push(Key x) { q.push(Element(top_priority++, x)); }
    Key pop() { top_priority--; return q.pop().elem; }
};
Run Code Online (Sandbox Code Playgroud)

LIFO的行为源于这样一个事实,即每个新元素的优先级都高于所有当前元素,因此它将在任何元素之前弹出.

有两种方法可以回答这个面试问题.一个是详细解释上面的结构.第二个是简单地提一下,嘟about一些关于O(lg n)的东西,并说你永远不会以这种方式实现堆栈.


Sto*_*ica 6

如果您不知道优先级队列是什么,请询问.如果您不知道堆栈是什么,请询问.如果你不明白这个问题,请问.到目前为止,您应该能够确定需要如下所示的适配器.

Stack :
    private:
      q : MaxPriorityQueue
      counter : 0

    public:
      push(x) : q.add(x, counter++)
      pop() : q.remove()
Run Code Online (Sandbox Code Playgroud)