# 优先级队列 - 无序数组的实现
# 介绍:
# 普通队列
一端进 一端出 ,FIFO 先进先出
# 优先级队列
一端进 一端出 ,它会按照队列中的优先级 出栈, 优先级高的 先 出栈
# 代码:
写了 三个类 主要是 PriorityQueue 中的逻辑代码
PriorityQueue
public class PriorityQueue<E extends Priority> implements Queue<E> | |
{ | |
Priority[] array; | |
int size; | |
// 初始化 实例化 Priority 数组 并 设定 长度为 capacity | |
public PriorityQueue(int capacity) | |
{ | |
array = new Priority[capacity]; | |
} | |
// 添加元素 | |
@Override | |
public boolean offer(E e) | |
{ | |
// 判断 队列中是否为 满了 | |
if(isFull()) | |
{ | |
return false; | |
} | |
// 向 size 处添加元素 并将 size 自增 | |
array[size++] = e; | |
return true; | |
} | |
// 返回优先级最高的索引值 | |
private int selectMax() | |
{ | |
int max = 0; | |
for(var i = 1; i < size; i++) | |
// 找到 优先级 最高的 索引 赋值给 max 然后返回 | |
if(array[i].priority() > array[max].priority()) | |
max = i; | |
return max; | |
} | |
// 取出 优先级 高的 值 | |
@Override | |
public E poll() | |
{ | |
// 判断 队列是否为 空 | |
if(isEmpty()) | |
return null; | |
// 获取 优先级最高的 索引位置 | |
int i = selectMax(); | |
// 通过 i 获取 优先级 最高的 值 | |
E e = (E) array[i]; | |
// 根据 i 删除这个值 | |
remove(i); | |
// 返回 优先级 最高的 值 | |
return e; | |
} | |
// 删除 poll 出去的值 | |
@Override | |
public void remove(int index) | |
{ | |
if (index < size - 1) | |
// 将 array 的 index + 1 的值开始 拷贝到 array 的 index 处 拷贝 size - index - 1 个值 | |
System.arraycopy(array, index + 1, array, index, size - index - 1); | |
// 移除后 size 自减 | |
size--; | |
} | |
// 获取 优先级最高 的值,但是不移除 | |
@Override | |
public E peek() | |
{ | |
// 判断 队列 是否为 空 | |
if(isEmpty()) | |
return null; | |
// 获取优先级最高的索引 | |
int i = selectMax(); | |
// 通过 i 索引返回优先级最高的值 | |
return (E) array[i]; | |
} | |
// 查看 队列是否 为 空 | |
@Override | |
public boolean isEmpty() | |
{ | |
// 判断 如果 size 为 0 说明 队列中没有任何值 | |
return size == 0; | |
} | |
// 查看 队列是否 满了 | |
@Override | |
public boolean isFull() | |
{ | |
// 判断 size 如果 等于 队列的长度说明 队列已经满了 | |
return size == array.length; | |
} | |
} |
Priority
public interface Priority | |
{ | |
// 返回对象的优先级,约定数字越大,优先级越高 | |
//return: 优先级 | |
int priority(); | |
} |
Entry
class Entry implements Priority { | |
String value; | |
int priority; | |
public Entry(int priority) { | |
this.priority = priority; | |
} | |
public Entry(String value, int priority) { | |
this.value = value; | |
this.priority = priority; | |
} | |
@Override | |
public int priority() { | |
return priority; | |
} | |
@Override | |
public String toString() { | |
return "(" + value + " priority=" + priority + ")"; | |
} | |
@Override | |
public boolean equals(Object o) { | |
if (this == o) return true; | |
if (o == null || getClass() != o.getClass()) return false; | |
Entry entry = (Entry) o; | |
return priority == entry.priority; | |
} | |
@Override | |
public int hashCode() { | |
return priority; | |
} | |
} |
# 测试代码:
@Test | |
public void testPoll() | |
{ | |
PriorityQueue<Entry> queue = new PriorityQueue<>(5); | |
queue.offer(new Entry("stack1", 4)); | |
queue.offer(new Entry("stack2", 3)); | |
queue.offer(new Entry("stack3", 2)); | |
queue.offer(new Entry("stack4", 5)); | |
queue.offer(new Entry("stack5", 1)); | |
assertFalse(queue.offer(new Entry("stack6", 7))); | |
assertEquals(5, queue.poll().priority()); | |
assertEquals(4, queue.poll().priority()); | |
assertEquals(3, queue.poll().priority()); | |
assertEquals(2, queue.poll().priority()); | |
assertEquals(1, queue.poll().priority()); | |
} |
执行结果: √