实现优先级队列的方法-java

我们可以使用数组实现,也可以使用堆来实现


使用数组来实现


  • add()

[1,3,5,7]
0 1 2 3
想插入2

需要从末尾反向遍历这个数组,找到插入新项的位置。每次迭代会得到当前的序号,如果当前项大于我们的新增项,需要将当前项向前移动。

如果当前的项小于新增项,就意味着找到插入点位置,直接break结束循环。

但是到底往哪里插入呢?
当我们反向遍历整个数组直到1时,1<2,所以我们找到了插入点,但不能直接items[i]=item,会覆盖掉当前值1,所以插入到当前项的右边 items[i+1]=item且count++;

当我们执行完这个循环时,我们会不清楚i是多少了,而我们却需要将新项插入到那里,所以我们需要在循环外定义i

[1,2,3,5,7]
0 1 2 3 4


  • 准备工作
 private int[] items = new int[5];
 private int count;
public void add(int item){
        if(count == items.length)
            throw new IllegalStateException();
        int i;
       for( i= count-1;i>=0;--i){
           if(item<items[i])
               items[i+1] = items[i];
           else
               break;
       }
       items[i+1] = item;
       count++;
    }


  • remove()

    当涉及到队列的删除时,我们都假设从队头开始删除,需要一个首指针来表示队头的起始位置,每删,让它指向下一个位置除一项,增加首指针的序号。

但如果我们假设队列是从末尾开始的 ,最大的数有最高优先级,它首先应该被删除,所以我们不需要首指针

public int remove(){
      if(isEmpty())
         throw new IllegalStateException();
      return items[--count];
    }

  • isEmpty()
public  boolean isEmpty(){
        return count==0;
    }

  • isFull()
 public boolean isFull(){
        return count == items.length;
    }

  • toString() 重写父类Object的方法
@Override
    public String toString(){
        return Arrays.toString(items);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值