C ++标准库提供带有priority_queue
的优先级队列。但这是否还提供了优先级堆栈?我寻找了priority_stack
,但没有找到任何东西。
答案 0 :(得分:1)
Stacks and queues是类似的抽象容器数据结构。它们的主要抽象区别是,堆栈实现了LIFO原理(后进先出),而队列是FIFO(先进先出)。
优先级与删除项目的顺序正交。优先级是指优先级较高的项目先于优先级较低的项目被删除:
不幸的是,标准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)
相同。