我们可以使用数组实现,也可以使用堆来实现
使用数组来实现
- 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);
}
}