用最大堆实现优先队列(c++)
程序员文章站
2022-05-10 20:42:24
关于最大堆,最小堆的概念这里不再介绍。
#include
#include
using namespace std;
template
class Prior...
关于最大堆,最小堆的概念这里不再介绍。
#include #include using namespace std; template class PriorityQueue { private: vector v; int size; const static int initCap = 100; private: int parent(int pos) { return pos/2; } int left(int pos) { return pos*2; } int right(int pos) { return pos*2 + 1; } public: PriorityQueue(): size(0) { v = vector(initCap); } bool enQueue(const T& t) { size++; v[size] = t; int i = size; //插入到尾部,一直上提到使当前堆符合最大堆性质为止 while(i > 1 && v[i] > v[parent(i)]) { T tmp = v[i]; v[i] = v[parent(i)]; v[parent(i)] = tmp; i = parent(i); } return true; } bool deQueue(T& max) { //取出最大值,并把尾部元素和最大值交换,然后维护当前堆到符合堆性质 if(size < 1) { return false; } max = v[1]; v[1] = v[size]; v[size] = max; size--; maxHeapIfy(1); return true; } void maxHeapIfy(int pos) { int largestPos = pos; if(left(pos) <= size && v[pos] < v[left(pos)]) { largestPos = left(pos); } if(right(pos) <= size && v[largestPos] < v[right(pos)]) { largestPos = right(pos); } if(largestPos != pos) { T tmp = v[pos]; v[pos] = v[largestPos]; v[largestPos] = tmp; maxHeapIfy(largestPos); } } int getSize() { return size; } bool top(T& t) { if(size < 1) { return false; } t = v[1]; return true; } }; int main() { PriorityQueue pQ; pQ.enQueue(8); pQ.enQueue(1); pQ.enQueue(3); pQ.enQueue(6); pQ.enQueue(5); pQ.enQueue(3); pQ.enQueue(10); pQ.enQueue(9); pQ.enQueue(7); int a = -1; while(pQ.deQueue(a)) { cout<