优先级队列
优先级队列是不同于先进先出队列的另一种队列。每次从队列中取出的是具有最高优先权的元素。如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了。这样,我们就引入了优先级队列 这种数据结构。 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有:查找、插入、删除; 一般情况下,查找操作用来搜索优先权最大的元素,删除操作用来删除该元素 。对于优先权相同的元素,可按先进先出次序处理或按任意优先权进行。
Java代码:
public class PriorityQueue {
private long[] arr = null;
private int nItems = 0;
private int maxSize = 0;
public PriorityQueue(int maxSize) {
arr = new long[maxSize];
this.maxSize = maxSize;
nItems = 0;
}
/**
*优先级队列的插入不是队尾,而是选择一个合适的按照某种顺序插入的
* (1)当队列长度为0时,插到第一个单元中
* (2)队列长度不为0时,将所有比要插入的数小的数据后移,这样大的数就在队列的头部了
*/
public void insert(long key)
{
int i = 0;
if (nItems == 0){
arr[nItems++] = key;
}else{
for (i=nItems-1;i>=0;i--){
if (key>arr[i]){
arr[i+1] = arr[i];
}else{
break;
}
}
arr[i+1] = key;
nItems++;
}
}
//移出的是数组最上端的数,这样减少数组元素的移动
public long remove()
{
return arr[--nItems];
}
//判断队列是否为空
public boolean isEmpty()
{
return (nItems == 0);
}
//判断队列是否为满
public boolean isFull()
{
return (nItems == maxSize);
}
//返回队列长度
public int size()
{
return nItems;
}
//获取最小数(优先级最高)
public long getPeekMin(){
return arr[nItems -1];
}
//输出队列
public void diaplayPQ(){
for(int i = nItems- 1;i >= 0;i--){
System.out.print(arr[i] + " ");
}
System.out.println();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现