本文最后更新于:星期四, 六月 18日 2020, 9:01 上午

MyLoopQueue

package DataStructure;

import java.util.NoSuchElementException;

/**
 * 这是一个用数组实现的优先队列。
 *
 * 该思路参考《数据结构Java语言描述》的page249。
 *
 * 入队时通过指定优先级参数添加到优先队列,出队时,不同优先级之间优先级较高的先出队,
 * 相同优先级,先入先出。
 *
 * 内部维护了一个队列数组,靠队列数组来简单地实现不同优先级队列的读写
 * 当初始化时指定一个最高优先级,然后用for循环一次性把数组中的对象都new出来。
 * add方法额外传入一个int表示优先级,然后利用这个int来访问数组中的元素,也便访问到对应优先级的队列了
 * remove同理。
 * @param <T>
 */
public class PriorityQueue<T> {

    private int highestPriority;//优先级从0到highestPriority
    private MyLoopQueue[] queueArray;//MyLoopQueue是用数组实现的,不可自动扩容的循环队列。
    private int currentMaxPriority;//当前最高的优先级。

    public PriorityQueue(int highestPriority,int capacityOfEachPriority){
        queueArray=new MyLoopQueue[highestPriority+1];
        this.highestPriority=highestPriority;
        currentMaxPriority=0;
        for (int i=0;i<=highestPriority;i++){
            queueArray[i]=new MyLoopQueue(capacityOfEachPriority);
        }
    }

    public void add(T element, int priority) {
        if (priority>highestPriority||priority<0){
            try {
                throw new Exception("输入的优先级不合法,最大优先级为:"+highestPriority+"最小优先级为:0");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (priority>currentMaxPriority){
            currentMaxPriority=priority;
        }
        MyLoopQueue q=queueArray[priority];
        q.add(element);
    }

    public T remove() {
        MyLoopQueue q=queueArray[currentMaxPriority];
        while (q.isEmpty() && currentMaxPriority>0){
            q=queueArray[--currentMaxPriority];
        }
        T answer= (T) q.remove();

        return answer;
    }

    public T peek() {
        return (T) queueArray[currentMaxPriority].peek();
    }

}  


算法     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

Activity启动模式脑图 上一篇
链表实现队列 下一篇