优先队列是一种特殊的队列,并不是按照“先进先出”的规则进出队列。
相对于普通的队列,优先队列的不同之处在于“优先”二字。优先队列中的元素拥有不同的优先级,进入队列的元素都按照
某一个性质进行排序,出队时选择优先级最高的元素。
二叉堆:父节点的值总大于(小于)任一子节点的值。所以,最大值或者最小值总在根节点,可以在常数时间内取得。把最大
、最小值映射到优先队列中的优先级,就可以用二叉堆来实现优先队列。
二叉堆是一棵完全二叉树,如果用数组来存放二叉堆的元素,那么当父节点为 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( length<size ) 32 { 33 int hole = length; 34 int parent = (hole)/2; 35 while( parent>0 && 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 else 45 { 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]<vec[child+1] ? child : child+1; 62 } 63 64 vec[hole] = vec[child]; 65 hole = child; 66 child = 2*hole; 67 } 68 vec[hole] = data; 69 } 70 else 71 { 72 cout << "队列空" << endl; 73 } 74 }