代码改变世界

数据结构学习----优先队列(Java实现)

  雪夜&流星  阅读(579)  评论(0编辑  收藏  举报

优先队列类,实现队列接口,使用排序单链表存储队列元素,元素按优先级升序排列

复制代码
package com.clarck.datastructure.queue;

import com.clarck.datastructure.linked.SortedSinglyLinkedList;

/**
 * 优先队列类,实现队列接口,使用排序单链表存储队列元素,元素按优先级升序排列
 * 
 * @author clarck
 * 
 * @param <T>
 */
public class PriorityQueue<T extends Comparable<T>> implements QQueue<T> {
    
    /**
     * 使用排序单链表存储队列元素
     */
    private SortedSinglyLinkedList<T> list;
    
    /**
     * 构造空队列
     */
    public PriorityQueue() {
        this.list = new SortedSinglyLinkedList<T>();
    }

    /**
     * 判断队列是否空,若空返回true
     */
    @Override
    public boolean isEmpty() {
        return list.isEmpty();
    }

    /**
     * 元素x入队,空对象不能入队
     */
    @Override
    public void enqueue(T x) {
        //根据元素大小插入在单链表适当位置
        list.insert(x);
    }

    /**
     * 出队,返回队头元素,若队列空返回null
     */
    @Override
    public T dequeue() {
        //返回队头元素,删除队头结点
        return list.remove(0);
    }

    /**
     * 返回队列所有元素的描述字符串
     */
    @Override
    public String toString() {
        return list.toString();
    }
}
复制代码

进程按优先级调度管理

复制代码
package com.clarck.datastructure.queue;

/**
 * 进程按优先级调度管理
 * 
 * @author clarck
 * 
 */
public class Process implements Comparable<Process> {
    /**
     * 进程名
     */
    private String name;
    /**
     * 优先级
     */
    private int priority;

    public Process(String name, int priority) {
        this.name = name;
        this.priority = priority;
    }

    /**
     * 比较两个进程的大小,约定进程排队次序的规则
     */
    @Override
    public int compareTo(Process p) {
        return this.priority - p.priority;
    }
    
    public String toString() {
        return "("+this.name+","+this.priority+")";
    }
}
复制代码

测试类:

复制代码
package com.clarck.datastructure.queue;

public class Process_test {
    public static void main(String[] args) {
        Process process[] = { new Process("A", 4), new Process("B", 3),
                new Process("C", 5), new Process("D", 4), new Process("E", 10),
                new Process("F", 1) };
        // 创建一个优先队列
        PriorityQueue<Process> que = new PriorityQueue<Process>();
        System.out.print("入队进程: ");
        for (int i = 0; i < process.length; i++) {
            que.enqueue(process[i]);
            System.out.print(process[i] + " ");
        }
        System.out.print("\n 出队进程: ");
        while (!que.isEmpty()) {
            System.out.print(que.dequeue().toString() + " ");
        }
        System.out.println();
    }
}
复制代码

测试结果:

入队进程: (A,4) (B,3) (C,5) (D,4) (E,10) (F,1) 
 出队进程: (F,1) (B,3) (D,4) (A,4) (C,5) (E,10) 

 

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示