由于我的硕士毕业论文选题是关于中间件方面的,故在写论文过程中涉及到一些常见的数据结构,今天就实现一个基于优先级的队列.
下面是我的任务类:(其实应该定义为接口的,在这里只是为了方便)
package com.liu.queue;
public class Task {
//任务的优先级
private int grade;
//指向下一个任务
private Task next;
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public Task getNext() {
return next;
}
public void setNext(Task next) {
this.next = next;
}
public Task(){}
public Task(int grade)
{
this.grade=grade;
this.next=null;
}
}
以下是优先级队列具体实现代码:
(基于优先级的任务队列采用链表数据结构实现,因为程序涉及较多的插入删除操作,另外链表所占用的内存空间方便扩展)
package com.liu.queue;
/*
* 基于优先级的队列
*/
public class GradeQueue {
//头指针
private Task head;
//尾指针(如果新任务优先级低于队列中任务的最低优先级,则直接插入队尾即可)
private Task tail;
//保存队列中最低优先级
private int min;
public Task getHead() {
return head;
}
public void setHead(Task head) {
this.head = head;
}
public int getMin() {
return min;
}
public void setMin(int min) {
this.min = min;
}
public Task getTail() {
return tail;
}
public void setTail(Task tail) {
this.tail = tail;
}
/*
* 构造方法
*/
public GradeQueue()
{
if(head==null)
{
head=new Task();
tail=head;
head.setNext(null);
min=0;
}
}
/*
* 添加任务
*/
public void add(Task task)
{
//头结点为空,无法插入
if(head==null)System.out.println("头结点为空,无法添加任务!");
//链表中只存在头结点,则直接在头结点后插入
else if(head.getNext()==null)
{
head.setNext(task);
tail=task;
min=task.getGrade();
}
//如果要插入的任务结点优先级小于min,则直接在末尾插入
else if(task.getGrade()<=min)
{
tail.setNext(task);
tail=task;
min=task.getGrade();
}
else
{
Task curr=head.getNext();
Task prev=head;
while(curr!=null&&curr.getGrade()>=task.getGrade())
{
prev=curr;
curr=curr.getNext();
}
//末尾插入
if(curr==null)
{
prev.setNext(task);
tail=task;
min=task.getGrade();
}
else
{
task.setNext(curr);
prev.setNext(task);
}
}
}
/*
* 打印
*/
public void print()
{
Task t=head.getNext();
while(t!=null)
{
System.out.print(t.getGrade()+"--->");
t=t.getNext();
}
}
public static void main(String[] args)
{
GradeQueue queue=new GradeQueue();
Task t1=new Task(5);
Task t2=new Task(8);
Task t3=new Task(6);
Task t4=new Task(3);
queue.add(t1);
queue.add(t2);
queue.add(t3);
queue.add(t4);
queue.print();
}
}
至此一个简单的优先级队列就已经实现了,由于其他有关队列的操作较简单,就不给予实现了```