29-咸鱼学Java-Java中的优先队列

简介

优先队列,显而易见,主要的是优先性,其次是队列,其优先性可以通过插入位置的不同进行判断,其队列性,决定了其可用原来的队列进行改造,来实现优先队列。
其图解为
这里写图片描述

代码

/**
 * 优先队列
 * @author 焦焱
 *
 */
public class PrioLinkQueue {
    /**
     * 内部类
     * @author 14831
     *
     */
    class Entry
    {
        /**
         * 数据域
         */
        int data;
        /**
         * 优先级,优先级越大,值越小
         */
        int prio;
        /**
         * 指向下一个节点的指针域
         */
        Entry next;
        /**
         * 有参构造函数
         * @param val   数据
         * @param prio  优先级
         */
        public Entry(int val,int prio) {
            this.data = val;
            this.prio = prio;
            this.next = null;
        }
        /**
         * 无参默认构造方式
         */
        public Entry() {
            this(-1,-1);
        }
    }
    /**
     * 头结点
     */
    private Entry head = null;
    /**
     * 队列长度
     */
    private int size = 0;
    /**
     * 构造函数,构造头结点
     */
    public PrioLinkQueue() {
        head = new Entry();
    }
    /**
     * 入队
     * @param val   数据
     * @param prio  优先级
     */
    public void Push(int val,int prio)
    {   //先获得头结点
        Entry cur = this.head;
        //进行循环,直到找到比新插入的节点优先级大的节点的前一个节点
        //(如,给124插入3就找到2号节点)
        for(;cur.next!=null;cur=cur.next)
        {
            if(cur.next.prio>prio){
                break;
            }
        }
        //代码效果同上
//      while(cur.next!=null)
//      {
//          if(cur.next.prio>prio)
//          {
//              break;
//          }
//          cur = cur.next;
//      }
        //创建一个新节点
        Entry entry = new Entry(val,prio);
        //当前节点的next等于cur的next
        entry.next = cur.next;
        //cur和entry链接到一起
        cur.next = entry;
        //队列长度+1
        size++;
    }
    /**
     * 出队
     * @return 数据
     */
    public int pop()
    {   //如果队为空
        if(isEmpty()){
            //直接返回-1
            return -1;
        }
        //现货区到当前头结点后第一个有效节点的数据
        int val = this.head.next.data;
        //头结点的next,直接越过第一个有效节点,指向第二个
        head.next = head.next.next;
        //队列长度-1
        size--;
        //返回数据
        return val;
    }
    /**
     * 判断是否为空
     * @return
     */
    public boolean isEmpty()
    {
        return size==0;
    }
    /**
     * 得到队头
     * @return
     */
    public int getTop()
    {
        if(isEmpty()){
            return -1;
        }
        return head.next.data;
    }
    /**
     * 打印当前队列(和单链表相同)
     */
    public void show()
    {
        if(isEmpty()){
            return;
        }
        Entry cur = this.head.next;
        while(cur!=null)
        {
            System.out.print(cur.data+" ");
            cur = cur.next;
        }
        System.out.println();
    }
}

测试

public static void main(String[] args) {
    PrioLinkQueue t = new PrioLinkQueue();
    t.Push(102,3);
    t.Push(101,2);
    t.Push(100,1);
    t.show();
    System.out.println("出队为"+t.pop());
    t.show();

}

结果
100 101 102
出队为100
101 102

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值