数据结构Java实现——②队列-->队列的“奇葩”二 优先级队列

本文深入探讨了优先级队列的概念及其在多个领域的应用。从理论出发,介绍了优先级队列的组成和基本操作,通过实例展示了如何实现优先级队列,并详细解析了代码实现过程。同时,阐述了优先级队列在哈夫曼树算法、操作系统等场景中的应用,突出了其高效性和灵活性。

写在前面


有很多时候,一些数据的存储不仅需要先进先出,而且还有根据数据的优先级来排序,也就是优先级高的一定先出去,优先级相同的先进先出,此时就会用到优先级队列


应用


其实优先级队列的应用十分广泛,比如说构造哈夫曼树算法,再比如在一些计算机操作系统中用优先级队列来来满足抢先式多任务操作系统等等等等


代码实现


1、优先级队列存储的数据元素的描述

package org.Stone6762.entity;

/**
 * @ClassName_PriorityQData优先级队列的结点中的数据部分的描述
 * @author_Stone6762
 * @CreationTime_2015年1月2日 下午3:39:55
 * @Description_
 */
public class PriorityQData {

	/**@data该节点的数据部分
	 */
	private Object data;
	
	/**@priority该结点的优先级
	 */
	private int priority;

	/** @Title构造器
	 */
	public PriorityQData(Object data, int priority) {
		super();
		this.data = data;
		this.priority = priority;
	}

	public Object getData() {
		return data;
	}

	public void setData(Object data) {
		this.data = data;
	}

	public int getPriority() {
		return priority;
	}

	public void setPriority(int priority) {
		this.priority = priority;
	}

}



2、优先级队列的实现

package org.Stone6762.MQueue.imple;

import org.Stone6762.MQueue.MQueue;
import org.Stone6762.entity.Node;
import org.Stone6762.entity.PriorityQData;

/**
 * @ClassName_PriorityQueue优先级队列
 * @author_Stone6762
 * @CreationTime_2015年1月2日 下午3:42:55
 * @Description_
 */
public class PriorityQueue implements MQueue {

	/**
	 * @front指向队首元素
	 */
	private Node front;

	/**
	 * @rear指向队尾元素
	 */
	private Node rear;

	/**
	 * @bigFront优先级队列的存储顺序_默认的是队首小
	 */
	private boolean bigFront;

	/**
	 *  @Title构造器
	 */
	public PriorityQueue(boolean bigFront) {
		this();
		this.bigFront = bigFront;
	}

	public PriorityQueue() {
		this.front = this.rear = null;
	}

	@Override
	public void clear() {
		this.front = this.rear = null;
	}

	@Override
	public boolean isEmpty() {

		return this.front == null;
	}

	@Override
	public int length() {
		Node t = this.front;
		int length = 0;
		while (t != null) {
			length++;
			t = t.getNext();
		}
		return length;
	}

	@Override
	public Object peek() {
		if (front != null) {
			return front.getData();
		}
		return null;
	}

	@Override
	public void offer(Object data) throws Exception {

		PriorityQData tData = (PriorityQData) data;
		Node newNode = new Node(tData);
		if (front == null) {// 对第一个元素进行特殊处理
			front = rear = newNode;
		} else {

			// 1.根据优先级找到要插入的合适的位置
			Node currNode = front, lastNode = front;

			if (!bigFront) {
				while (currNode != null
						&& tData.getPriority() >= ((PriorityQData) currNode
								.getData()).getPriority()) {
					lastNode = currNode;
					currNode = currNode.getNext();
				}// -----------跳出循环有两种情况,一,到了队尾,二,找到了合适的位置
			} else {
				while (currNode != null
						&& tData.getPriority() <= ((PriorityQData) currNode
								.getData()).getPriority()) {
					lastNode = currNode;
					currNode = currNode.getNext();
				}// -----------跳出循环有两种情况,一,到了队尾,二,找到了合适的位置
			}

			// 2.对插入的位置进行分类讨论
			if (currNode == null) {// 该结点应该插在队尾
				rear.setNext(newNode);
				rear = newNode;
			} else if (currNode == front) {// 该结点应该插在队首
				newNode.setNext(front);
				front = newNode;
			} else {// 该结点在队中间的某一位置
				newNode.setNext(currNode);
				lastNode.setNext(newNode);
			}
		}
	}

	@Override
	public Object poll() {

		if (front != null) {
			Node t = front;
			front = front.getNext();
			return t;
		}
		return null;
	}

	public void disPly() {
		if (front != null) {
			Node t = front;
			while (t != null) {
				PriorityQData temp = (PriorityQData) t.getData();
				System.out.println("  "+temp.getData() + "       "
						+ temp.getPriority());
				t = t.getNext();
			}
		} else {
			System.out.println("队列为空!!");
		}
	}

}






评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值