C++ 中的优先级堆栈

Priority stack in C++

C++ 标准库提供了一个具有 priority_queue 的优先级队列。但它是否也提供 优先级堆栈 ?我寻找 priority_stack 但没有找到任何东西。

在c++中,标准模板库(STL)提供了一个priority_queue。参见示例 priority_queue。 STL 不提供 priority_stack 容器。

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

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

例如:一个优先级队列(A 1) (B 3) (C 2)会按照B C A.

的顺序给出元素

不清楚你所说的"priority stack"是什么意思,但是如果栈只是一个移除顺序相反的队列,那么"priority stack"的自然解释是一个优先级队列,其中的顺序移除是相反的,即首先给出优先级最低的元素。但这与 优先级队列 相同,其中优先级被颠倒(通常只是否定它们):

示例:一个"priority stack"(A 1) (B 3) (C 2),它会给出顺序A C B,与优先级队列相同(A -1) (B -3) (C -2).

什么是优先堆栈?

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) 

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