持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
介绍
容器类是日常开发中经常使用的一种类,不同的类与不同的数据结构相关,其中队列是一种较为特殊的类,队列中的元素以 “先进先出” 的方式获取。本次我们将尝试使用数组作为底层,实现一个具有队列特点,且功能完善的类 Queue。
涉及到的知识点有:
数组,面向对象,类和对象,包。
准备
1.建立两个类,
一个Queue.java,一个TestQueue.java
2.分析:
我们需要
-
创建一个名为
element的int[]类型的属性,保存队列中的 int 值。将element初始化为长度8的数组。 -
创建一个名为
size的属性,保存队列中的元素个数。 -
方法
enqueue(int v),用于将v加人到队列中。若存入的元素致使个数超出数组限制,则需要将element数组的容量扩展至从前容量的两倍。 -
方法
dequeue(),用于从队列中移除元素并返回该元素。(如果一个元素从数组的开始部分移除,你需要将数组中的所有元素往左边改变一个位置。)
提示:
- 方法
enqueue(int v)在执行时要判断队列内的元素个数,若存入的元素致使个数超出数组限制,则需要将element数组的容量扩展至从前容量的两倍。 - 方法
dequeue()取出并移除元素时需要从element数组的起始位置开始取出,因此每次取出都需要将数组内的剩余元素全部向前移动一位。 test:代码如下
public static void main(String[] args) {
// 创建队列
Queue queue = new Queue();
// 存 0-20 共 21 个数字
for(int i = 0 ; i <= 20 ; i++){
queue.enqueue(i);
}
// 取出所有元素
while (!queue.empty()){
System.out.println(queue.dequeue());
}
}
queue里面方法有:
public Queue(){
int[] element=new int[7];
}
为啥是7?:数组下标从0开始
enqueue(int v),用于将 v 加入到队列中
public void enqueue(int v){
test=element;
int high=element.length;
if(size<high){
element[size]=v;
size++;
}else{
element=new int[2*high];
for(int i=0;i<size;i++){
element[i]=test[i];
}
element[size]=v;
size++;
}
}
方法 empty(),如果队列是空的话,该方法返回 true。
public boolean empty(){
if(size==0){
return true;
}else{
return false;
}
}
public int getSize() {
return size;
}
然后就是最最关键的,取数据了。大家都知道队列是先入先出,那么我们这个题里面就会从element【0】开始出队列,每次都是出第一个,然后把后面数据前移一位。
最开始我没有想到从0开始输出,我直接
int h=0;
public int dequeue(){
//int a=element[0];
int a=element[h];
h++;
return a;
//return a;
}
当然这个是有问题做法,然后我大概知道了。这个时候我们队列里面有0-20的数据,但是因为自动内存扩张,目前有32为,只有21个数据,还有11个都是0.
这样说来,如果我每次取element[0],然后把element[i]变成element【i+1】,就实现了取出第一个数,那么我们的size需要重新返回。0不算size。
getsize修改成
public int getSize() {
// return size;
int i=0;
for(int j=1;j<element.length;j++){
if(element[i]!=0){
i++;
}
}
return i;
}
为啥从1开始,因为0对应位置,我们赋值就是0
取出:和上面一样的,但是如果对应值是0,我们就跳过 for(){
if(element[i]!=0){
h=element【i】;
size--;
} }