简介
优先队列,显而易见,主要的是优先性,其次是队列,其优先性可以通过插入位置的不同进行判断,其队列性,决定了其可用原来的队列进行改造,来实现优先队列。
其图解为
代码
/**
* 优先队列
* @author 焦焱
*
*/
public class PrioLinkQueue {
/**
* 内部类
* @author 14831
*
*/
class Entry
{
/**
* 数据域
*/
int data;
/**
* 优先级,优先级越大,值越小
*/
int prio;
/**
* 指向下一个节点的指针域
*/
Entry next;
/**
* 有参构造函数
* @param val 数据
* @param prio 优先级
*/
public Entry(int val,int prio) {
this.data = val;
this.prio = prio;
this.next = null;
}
/**
* 无参默认构造方式
*/
public Entry() {
this(-1,-1);
}
}
/**
* 头结点
*/
private Entry head = null;
/**
* 队列长度
*/
private int size = 0;
/**
* 构造函数,构造头结点
*/
public PrioLinkQueue() {
head = new Entry();
}
/**
* 入队
* @param val 数据
* @param prio 优先级
*/
public void Push(int val,int prio)
{ //先获得头结点
Entry cur = this.head;
//进行循环,直到找到比新插入的节点优先级大的节点的前一个节点
//(如,给124插入3就找到2号节点)
for(;cur.next!=null;cur=cur.next)
{
if(cur.next.prio>prio){
break;
}
}
//代码效果同上
// while(cur.next!=null)
// {
// if(cur.next.prio>prio)
// {
// break;
// }
// cur = cur.next;
// }
//创建一个新节点
Entry entry = new Entry(val,prio);
//当前节点的next等于cur的next
entry.next = cur.next;
//cur和entry链接到一起
cur.next = entry;
//队列长度+1
size++;
}
/**
* 出队
* @return 数据
*/
public int pop()
{ //如果队为空
if(isEmpty()){
//直接返回-1
return -1;
}
//现货区到当前头结点后第一个有效节点的数据
int val = this.head.next.data;
//头结点的next,直接越过第一个有效节点,指向第二个
head.next = head.next.next;
//队列长度-1
size--;
//返回数据
return val;
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty()
{
return size==0;
}
/**
* 得到队头
* @return
*/
public int getTop()
{
if(isEmpty()){
return -1;
}
return head.next.data;
}
/**
* 打印当前队列(和单链表相同)
*/
public void show()
{
if(isEmpty()){
return;
}
Entry cur = this.head.next;
while(cur!=null)
{
System.out.print(cur.data+" ");
cur = cur.next;
}
System.out.println();
}
}
测试
public static void main(String[] args) {
PrioLinkQueue t = new PrioLinkQueue();
t.Push(102,3);
t.Push(101,2);
t.Push(100,1);
t.show();
System.out.println("出队为"+t.pop());
t.show();
}
结果
100 101 102
出队为100
101 102