package jxau.lyx.pQueue;/** * * @author liyixiang * @2014-9-21 * @DataStrutureType: 队列——优先级队列 * @TODO: * 优先级队列 * 在优先级队列中,数据按关键字的值有序,这样关键字最小的数据项(或者最大) * 总是在队头 * 本以为会有一个数据项来表示优先级的大小,其实不用,insert到队列中时,就已经 * 比较后排序! * 优先级队列不需要front rear 因为front总是nItems-1,rear==0 */public class PriorityQueue { private int maxSize; //队列最大空间 private long[] queueArray; //队列空间(此处我们申请的是可比较的整数型数组) private int nItems; //队中含有的元素个数 /** * 初始化 * @param s:队空间大小 */ public PriorityQueue(int s){ maxSize = s; queueArray = new long[maxSize]; nItems = 0; } /** * *@liyixiang *@2014-9-20 *@param:obj 入队元素 *@return:void *@TODO: * 入队: * 先检查队列是否有数据项,如果没有,就插入到下标为0的单元中,否则,从数组 *顶部开始上移存在的数据项,直到找到新数据项应当插入的位置,然后,插入数据项, *并把nItems+1,优先级队列可能出现队满情况,应当在insert之前判断isFull * */ public void insert(long item){ int j; if(nItems == 0){ queueArray[nItems++] = item; }else { //比较元素大小,使队列中的元素有序 for(j=nItems-1;j>=0;j--){ if(item > queueArray[j]){ queueArray[j+1] = queueArray[j]; }else { break; } } queueArray[j+1] = item; nItems++; } } /** * *@liyixiang *@2014-9-21 *@param *@return:Object:移除元素 *@TODO: * 出队 * 由于优先级队列,元素有序,所以只有最大或者最小元素出队 */ public long remove(){ return queueArray[--nItems]; } /** * *@liyixiang *@2014-9-21 *@param *@return:Object *@TODO: * 获取优先级最小元素 */ public Object peekMin(){ return queueArray[nItems-1]; } /** * *@liyixiang *@2014-9-21 *@param *@return:boolean *@TODO: * 判断队列是否为空 */ public boolean isEmpty(){ return (nItems == 0); } /** * *@liyixiang *@2014-9-21 *@param *@return:boolean *@TODO: * 判断队列是否为满 * */ public boolean isFull(){ return nItems == maxSize; } /** * *@liyixiang *@2014-9-21 *@param *@return:int *@TODO: * 获取当前队列元素个数 */ public int size(){ return nItems; }}