C ++中的优先级堆栈

时间:2019-03-17 12:40:18

标签: c++ data-structures stack queue heap

C ++标准库提供带有priority_queue的优先级队列。但这是否还提供了优先级堆栈?我寻找了priority_stack,但没有找到任何东西。

3 个答案:

答案 0 :(得分:1)

什么是优先级堆栈?

Stacks and queues是类似的抽象容器数据结构。它们的主要抽象区别是,堆栈实现了LIFO原理(后进先出),而队列是FIFO(先进先出)。

优先级与删除项目的顺序正交。优先级是指优先级较高的项目先于优先级较低的项目被删除:

  • 在两种情况下,如果只有一个元素具有最高优先级,则它将是第一个被删除的元素。
  • 但是,如果几个元素具有相同的最高优先级,则优先级堆栈将首先删除最新推送的元素,而priority queue将首先删除第一个排队的元素。

C ++标准库中是否有优先级堆栈?

不幸的是,标准C ++仅提供priority_queue。这是一个适配器。

没有priority_stack。因此,您需要实现自己的。

假说:我认为原因是优先级栈有些奇怪。肯定有有效的用例,但是堆栈的大多数用途是以迭代的方式实现某些递归算法,而优先级没有意义。

快速实施

如果您不知道从哪里开始,这里有一个简单的实现:

template<class T> 
class priority_stack {
    vector<T> stack;  
public:  
    bool empty() const { return stack.size()==0; } 
    void push(const T& x) { 
        stack.push_back(x); 
        for (int i=stack.size()-1; i!=0; i--)
            if ( (stack[i]<stack[i-1]))            // assuming priority is reflected in order of elements
                swap (stack[i-1],stack[i]);
    }  
    void pop() {
        if (! empty() )
            stack.resize(stack.size()-1);
    }
    T top() { 
        if (empty()) 
            throw; 
        return stack[stack.size()-1]; 
    }  
};

您可以使用以下数据结构进行测试:

struct data {
    int priority; 
    string message;  
    bool operator< (const data&a) const {  // order by priority
        return priority<a.priority;  
    } 
};

online demo将为您显示区别:

Data to be pushed:(10,one) (10,two) (11,high) (12,very high) (10,three) 
Priority queue (FIFO): (12,very high) (11,high) (10,one) (10,two) (10,three) 
Priority stack (LIFO): (12,very high) (11,high) (10,three) (10,two) (10,one) 

注意:如果您的数据元素很大,则将结构基于列表而不是向量,然后将推入的数据插入正确的位置,从而最大程度地减少交换,可能会更有趣。

答案 1 :(得分:0)

在c ++中,标准模板库(STL)提供了priority_queue。例如,请参见priority_queue。 STL不提供priority_stack容器。如果愿意,您可以写一篇。希望有帮助。

答案 2 :(得分:0)

在常规队列或堆栈中,元素的删除顺序取决于插入顺序(队列的顺序相同,而堆栈的顺序相反)。

在优先级队列中,顺序不取决于插入顺序,而是取决于分配给每个元素的某些自定义“优先级”。优先级队列首先赋予具有最高优先级的元素。

例如:优先级队列(A 1) (B 3) (C 2)将按B C A的顺序给出元素。

您不清楚“优先级堆栈”是什么意思,但如果堆栈只是移除顺序颠倒的队列,那么“优先级堆栈”的自然解释就是优先级队列,其中移除顺序颠倒了,即,首先赋予优先级最低的元素。但这与 priority队列相同,在该队列中,优先级被颠倒了(通常是通过否定它们):

示例:具有优先级(A 1) (B 3) (C 2)的“优先级堆栈” A C B与优先级队列(A -1) (B -3) (C -2)相同。