【摘要】
本文从两个方面介绍优先队列,1.优先队列的常见函数;2.优先队列代码实现:堆排序和哈夫曼树。
【正文】
一.优先队列函数列表
二.优先队列代码用例
- empty() 如果优先队列为空,则返回真
- pop() 删除第一个元素
- push() 加入一个元素
- size() 返回优先队列中拥有的元素的个数
- top() 返回优先队列中有最高优先级的元素
示例1 #include <iostream> #include <queue> #include <deque> #include <vector> #include <functional> using namespace std; #if _MSC_VER > 1020 // if VC++ version is > 4.2 using namespace std; // std c++ libs implemented in std #endif // Using priority_queue with deque // Use of function greater sorts the items in ascending order typedef deque<int, allocator<int> > INTDQU; typedef priority_queue<int,INTDQU, greater<int> > INTPRQUE; // Using priority_queue with vector // Use of function less sorts the items in descending order typedef vector<char, allocator<char> > CHVECTOR; typedef priority_queue<char,CHVECTOR,less<char> > CHPRQUE; void main(void) { int size_q; INTPRQUE q; CHPRQUE p; // Insert items in the priority_queue(uses deque) q.push(42); q.push(100); q.push(49); q.push(201); // Output the item at the top using top() cout << q.top() << endl; // Output the size of priority_queue size_q = q.size(); cout << "size of q is:" << size_q << endl; // Output items in priority_queue using top() // and use pop() to get to next item until // priority_queue is empty while (!q.empty()) { cout << q.top() << endl; q.pop(); } // Insert items in the priority_queue(uses vector) p.push('c'); p.push('a'); p.push('d'); p.push('m'); p.push('h'); // Output the item at the top using top() cout << p.top() << endl; // Output the size of priority_queue size_q = p.size(); cout << "size of p is:" << size_q << endl; // Output items in priority_queue using top() // and use pop() to get to next item until // priority_queue is empty while (!p.empty()) { cout << p.top() << endl; p.pop(); } }
输出结果: 42 size of q is:4 42 49 100 201
m size of p is:5 m h d c a
示例2 #include<iostream> #include<queue> using namespace std; struct cmp { bool operator()(const int &a,const int &b) { return a<b;//按升序排序 } }; typedef priority_queue< int, vector<int>, cmp > qu; void main() { qu p; p.push(42); p.push(100); p.push(49); p.push(201); while (!p.empty()) { cout << p.top() << endl; p.pop(); } }
输出结果: 201 100 49 42
示例3(用priority_queue实现哈夫曼树): #include<iostream> #include<queue> using namespace std; class Node { public: int weight; Node* left; Node* right; Node(int w, Node* l, Node* r): weight(w), left(l), right(r) {} Node(int w): weight(w), left(NULL), right(NULL) {} }; class cmp //用于priority_queue的仿函数类 { public : bool operator()(Node* a,Node* b) { return a->weight>=b->weight; } }; //传入的是指针,如果用对象去实现,你就不知道左右指针的指向了 //中序遍历 void InOrder(Node* p) { if (p != NULL) { InOrder(p->left); cout<<p->weight<<'/t'; InOrder(p->right); } } void freeTree(Node* p)//销毁二叉树 { if(p->left!=NULL) freeTree(p->left); if(p->right!=NULL) freeTree(p->right); delete(p); } int main() { Node* m1,*m2; priority_queue<Node*,vector<Node*>,cmp> q; for(int i=0;i<6;++i)//6个节点 { int n=rand()%100; q.push(new Node(n));//权值随机产生 cout<<n<<'/t'; } cout<<endl; for(int j=1;j<6;++j)//合并5次 { m1=q.top(); q.pop(); m2=q.top(); q.pop(); int w=m1->weight+m2->weight; q.push(new Node(w,m1,m2)); } Node* root=q.top(); InOrder(root); cout<<endl; freeTree(root); system("pause"); return 0; }
输出结果: 41 67 34 0 69 24 41 99 0 24 24 58 34 235 67 136