优先级堆栈在C++

Priority stack in C++

本文关键字:C++ 堆栈 优先级      更新时间:2023-10-16

C++标准库提供具有priority_queue的优先级队列。但它是否也提供优先级堆栈?我找了priority_stack,但什么也没找到。

什么是优先级堆栈?

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

优先级与删除项目的顺序正交。 优先级意味着优先级较高的项目先于优先级较低的项目删除:

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

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;  
} 
};

在线演示将向您展示差异:

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) 

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

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

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

在优先级队列中,顺序不取决于插入顺序,而是取决于分配给每个元素的某个自定义"优先级"。优先级队列首先提供优先级最高的元素。

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

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

示例:一个"优先级堆栈"(A 1) (B 3) (C 2),它将给出顺序A C B,将与优先级队列(A -1) (B -3) (C -2)相同。