优先级堆栈在C++
Priority stack in C++
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)
相同。
- 算法问题:查找从堆栈中弹出的所有序列
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- 为什么调用堆栈数组会导致内存泄漏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 在 leetcode 上提交解决方案时出现堆栈缓冲区溢出错误
- 我的 int main() 中出现堆栈溢出错误
- 堆栈和队列是否像C++中的数组一样传递?
- 拥有映射的现代方法,该映射可以指向或引用已在堆栈上分配的不同类型的数据
- 为什么 STL 容器适配器堆栈中的 top 返回常量引用?
- 从堆栈分配的原始指针构造智能指针
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 堆栈中大小变量输入错误 (C++)
- 堆栈问题(平衡表达式问题集)
- C++ 在堆栈中包含多态属性的类对象存储
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 在 C++ 中使用链表进行堆栈
- 变量周围的堆栈'...'已损坏
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- C++线程的可用堆栈大小