实现一个优先级队列

       由于我的硕士毕业论文选题是关于中间件方面的,故在写论文过程中涉及到一些常见的数据结构,今天就实现一个基于优先级的队列.

 

       下面是我的任务类:(其实应该定义为接口的,在这里只是为了方便)

       

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();
	}
}

 

 

    至此一个简单的优先级队列就已经实现了,由于其他有关队列的操作较简单,就不给予实现了```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值