实现一个优先级队列

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

 

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

       

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

 

 

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

优先级队列是一种特殊的队列,它的每个元素都有一个优先级。在队列中,高优先级的元素会先被处理,而低优先级的元素则会被放置到队列的末尾。下面一个简单的优先级队列的 C 语言实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct { int priority; int value; } node; typedef struct { node *nodes; int len; int size; } priority_queue; void push(priority_queue *q, int priority, int value) { if (q->len == q->size) { q->size *= 2; q->nodes = (node*)realloc(q->nodes, q->size * sizeof(node)); } int i = q->len++; while (i > 0) { int p = (i - 1) / 2; if (q->nodes[p].priority <= priority) { break; } q->nodes[i] = q->nodes[p]; i = p; } q->nodes[i].priority = priority; q->nodes[i].value = value; } int pop(priority_queue *q) { if (q->len == 0) { return -1; } int ret = q->nodes[0].value; q->len--; node last = q->nodes[q->len]; int i = 0; while (i * 2 + 1 < q->len) { int a = i * 2 + 1, b = i * 2 + 2; if (b < q->len && q->nodes[b].priority < q->nodes[a].priority) { a = b; } if (q->nodes[a].priority >= last.priority) { break; } q->nodes[i] = q->nodes[a]; i = a; } q->nodes[i] = last; return ret; } priority_queue *new_priority_queue() { priority_queue *q = (priority_queue*)malloc(sizeof(priority_queue)); q->size = 1; q->len = 0; q->nodes = (node*)malloc(q->size * sizeof(node)); return q; } void free_priority_queue(priority_queue *q) { free(q->nodes); free(q); } int main() { priority_queue *q = new_priority_queue(); push(q, 3, 10); push(q, 1, 20); push(q, 2, 30); push(q, 0, 40); while (q->len > 0) { printf("%d ", pop(q)); } free_priority_queue(q); return 0; } ``` 在这个实现中,我们使用了一个结构体 `node` 存储每个元素的优先级和值,一个结构体 `priority_queue` 存储队列的所有元素。使用 `push` 函数将新元素添加到队列中,使用 `pop` 函数从队列中删除并返回具有最高优先级的元素。我们还提供一个 `new_priority_queue` 函数用于创建一个新的队列,并提供一个 `free_priority_queue` 函数用于释放队列。在 `main` 函数中,我们首先创建了一个新的队列,然后向队列中添加了四个元素,每个元素都有不同的优先级和值。最后,我们使用 `pop` 函数从队列中删除所有元素,并将它们打印出来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值