优先队列是一种特殊的队列,并不是按照“先进先出”的规则进出队列。
相对于普通的队列,优先队列的不同之处在于“优先”二字。优先队列中的元素拥有不同的优先级,进入队列的元素都按照
某一个性质进行排序,出队时选择优先级最高的元素。
二叉堆:父节点的值总大于(小于)任一子节点的值。所以,最大值或者最小值总在根节点,可以在常数时间内取得。把最大
、最小值映射到优先队列中的优先级,就可以用二叉堆来实现优先队列。
二叉堆是一棵完全二叉树,如果用数组来存放二叉堆的元素,那么当父节点为 i 时,左儿子节点是2i,右儿子节点是2i+1。
基于这一特性,可以直接用数组来存放二叉堆的元素。
1 class priorityQueue 2 { 3 int size; 4 int length; 5 int *vec; 6 7 public : 8 priorityQueue(const int size):size(size),length(1) 9 {10 vec = new int[size];11 };12 ~priorityQueue()13 {14 }15 void enqueue( int data );16 void dequeue();17 void print()18 {19 int i = length-1;20 while( i>=1 )21 {22 cout << vec[i] << " ";23 i--;24 }25 cout << endl;26 }27 };28 29 void priorityQueue::enqueue( int data )30 {31 if( length0 && vec[parent]>data )36 {37 vec[hole] = vec[parent];38 hole = parent;39 parent = (hole)/2;40 }41 vec[hole] = data;42 length++;43 }44 else45 {46 cout << "队列满" << endl;47 }48 }49 50 void priorityQueue::dequeue()51 {52 if( length>1 )53 {54 int hole = 1;55 int child = 2*hole;56 int data = vec[--length];57 while( child<=length )58 {59 if( child+1<=length )60 {61 child = vec[child]