package DataStructure;
import java.util.NoSuchElementException;
/**
* 这是一个用数组实现的优先队列。
*
* 该思路参考《数据结构Java语言描述》的page249。
*
* 入队时通过指定优先级参数添加到优先队列,出队时,不同优先级之间优先级较高的先出队,
* 相同优先级,先入先出。
*
* 内部维护了一个队列数组,靠队列数组来简单地实现不同优先级队列的读写
* 当初始化时指定一个最高优先级,然后用for循环一次性把数组中的对象都new出来。
* add方法额外传入一个int表示优先级,然后利用这个int来访问数组中的元素,也便访问到对应优先级的队列了
* remove同理。
* @param <T>
*/
public class PriorityQueue<T> {
private int highestPriority;//优先级从0到highestPriority
private MyLoopQueue[] queueArray;//MyLoopQueue是用数组实现的,不可自动扩容的循环队列。
private int currentMaxPriority;//当前最高的优先级。
public PriorityQueue(int highestPriority,int capacityOfEachPriority){
queueArray=new MyLoopQueue[highestPriority+1];
this.highestPriority=highestPriority;
currentMaxPriority=0;
for (int i=0;i<=highestPriority;i++){
queueArray[i]=new MyLoopQueue(capacityOfEachPriority);
}
}
public void add(T element, int priority) {
if (priority>highestPriority||priority<0){
try {
throw new Exception("输入的优先级不合法,最大优先级为:"+highestPriority+"最小优先级为:0");
} catch (Exception e) {
e.printStackTrace();
}
}
if (priority>currentMaxPriority){
currentMaxPriority=priority;
}
MyLoopQueue q=queueArray[priority];
q.add(element);
}
public T remove() {
MyLoopQueue q=queueArray[currentMaxPriority];
while (q.isEmpty() && currentMaxPriority>0){
q=queueArray[--currentMaxPriority];
}
T answer= (T) q.remove();
return answer;
}
public T peek() {
return (T) queueArray[currentMaxPriority].peek();
}
}
数组实现的优先队列
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 解决方案 下面的类利用 heapq 模块实现了一个简单的优先级队列: 下面使用 仔细观察可以发现,第一个 pop(...
- 在 RxSwift 框架中,在 PriorityQueue.swift 文件中,使用数组实现了一个优先级队列 Pr...
- 思路 取堆的一半后,分解最小子堆 (使用sink(),如果子结点有比父结点大的值的话 取较大子结点和父结点交换,满...