优先队列
来源:互联网 发布:client mac addr 编辑:程序博客网 时间:2024/04/29 16:21
队列可以分为FIFO队列和优先队列,优先队列也可以分为最大优先队列和最小优先队列。优先队列可以使用堆来实现,在一个堆结构中,优先队列的查找,插入,删除操作,都可以在O(lgn)的时间内完成。优先队列的常见使用是操作系统的作业调度,每当发生中断时,操作系统会从优先队列中选取一个优先级别最高的作业执行。下面是用最小堆实现的最小优先队列:
# include <iostream>using namespace std;# include <stdlib.h># define MIN -1# define MAXSIZE 100typedef struct priority_queue{int *arr;int size;int capicity;}pq;int main(){ int isempty(pq *T);int isfull(pq *T);pq* init(pq *T);pq* insert(pq *T,int x);int delmin(pq *T);int top(pq *T);pq *T=0;T=init(T);for(int i=0;i<10;i++)T=insert(T,i+1);cout<<delmin(T)<<endl;cout<<isfull(T)<<endl;cout<<isempty(T)<<endl;system("pause");return 0;}pq* init(pq *T) //优先队列初始化{T=(pq *)malloc(sizeof(pq));T->size=0;T->capicity=MAXSIZE;T->arr=(int *)malloc((MAXSIZE+1)*sizeof(pq));T->arr[0]=MIN;return T;}int isfull(pq *T) //判断队列是否已满{return T->size >=MAXSIZE;}pq* insert(pq *T,int x) //插入元素{if(isfull(T))return NULL;int i;for(i=++T->size;T->arr[i/2]>x;i/=2)T->arr[i]=T->arr[i/2];T->arr[i]=x;return T;}int isempty(pq *T) //判断队列是否为空{return T->size==0;}int delmin(pq *T) //删除最小元素{if(isempty(T))return -1;int min=T->arr[1];int last=T->arr[T->size--];int i,child;for(i=1;2*i<=T->size;i=child){child=2*i;if(child!=T->size&&T->arr[child+1]<T->arr[child])child++;if(T->arr[child]<last)T->arr[i]=T->arr[child];else break;}T->arr[i]=last;return min;}int top(pq *T) //返回堆顶元素{return T->arr[T->size];}
在C++中,可以使用容器适配器priority_queue实现优先队列。
priority_queue可以支持的操作有:
q.empty() 队列为空返回值为真 ,
q.size() 返回队列元素个数,
q.pop() 删除最高优先级别的元素,
q.top()返回优先级别最高的元素,
q.push()以优先级插入元素
优先队列可以存放数组中的元素:
# include <iostream>using namespace std;# include <stdlib.h># include <functional># include <queue># include <vector>int main(){priority_queue<int,vector <int>,less<int> > q; //把less<int> 换成 greater<int> 就可以建立最小优先队列int a[10]={1,2,3,4,5,6,7,8,9,10};int i=0;for(i=0;i<10;i++)q.push(a[i]);while(!q.empty()){cout<<q.top()<<endl;q.pop();}system("pause");return 0;}优先队列可以存放类类型的对象:
# include <iostream>using namespace std;# include <stdlib.h># include <functional># include <queue># include <vector>class cmp{int i;public:cmp(int x):i(x){}friend bool operator <(const cmp &a,const cmp &b) //建立最小优先队列{return a.i>b.i;}friend ostream& operator <<(ostream & os,const cmp t){return os<<t.i<<endl;}int geti(){return i;}};int main(){priority_queue <cmp> q;int i=0;for(i=0;i<10;i++)q.push(cmp(i));while(!q.empty()){cout<<q.top()<<endl;q.pop();}system("pause");return 0;}
0 0
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 优先队列
- 面向对象和面向过程的本质区别
- GC(垃圾处理机制)面试题
- 使用Watin做Web UI Automation Test
- class _declspec(dllexport) class_name与class _declspec(dllimport) class_name的配套使用
- 分享30个最佳 jQuery Lightbox 效果插件
- 优先队列
- #pragma预处理命令的使用
- CSS border-style 属性
- MySQL基础知识
- linux 常用命令2
- android:gravity / android:layout_Gravity,android:padding / android:layout_margin属性区分
- Ubuntu下安装VNC server
- ASP.NET MVC 部分视图
- c++学习日记之使用类来模拟随机漫步