用最大堆实现优先队列(c++)
2017-08-18 00:42
633 查看
关于最大堆,最小堆的概念这里不再介绍。
#include <iostream> #include <vector> using namespace std; template<typename T> class PriorityQueue { private: vector<T> 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<T>(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<int> 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<<a<<" "; } cout<<endl; return 0; }
相关文章推荐
- 基于算法导论6.5用最大堆实现的优先队列(C++)
- [C++ 实现最大值优先队列和最小值优先队列]
- 算法设计之,堆,堆排序,基于最大堆的最大优先队列的实现(C++实现)
- 数据结构实现之最大索引优先队列
- heap实现的最大优先队列
- 【数据结构】实现大小堆也叫二叉堆(类似c++中的优先队列)
- 优先队列的应用 C++实现
- 迷宫最短路径的C++实现(队列:广度优先)
- 优先队列C++实现和应用
- 算法笔记(堆实现的最大优先队列)
- DataStructure之最大优先队列的java实现
- C++ 大根堆 实现优先队列
- C++非递归队列实现二叉树的广度优先遍历
- 求最大网络流的C++实现(利用广度优先遍历的思想)
- C++实现优先队列
- 算法笔记(堆实现的最大优先队列)
- C++ 优先队列的简单实现
- 最小堆优先队列C++实现
- 最大堆及优先队列的实现
- C++ 实现优先队列的简单实例