数据结构——队列——优先级队列

本文介绍了一种基于数组实现的优先级队列数据结构。该队列能够自动维护队列中元素的顺序,确保每次出队操作都能得到优先级最高的元素。文章详细解释了优先级队列的基本操作,包括插入、删除最高优先级元素等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值