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;
}
}
转载于:https://my.oschina.net/liyixiangBlog/blog/316655