问题:数组是一个能够存储多个元素的相同类型的容器,那么我们怎样能够实现用数组完成队列的功能呢?
首先我们应该先了解一下队列的特性:
队列是一种特殊的线性表,他的特殊之处就在于只能够在表的头部分进行删除操作,而在表的最后部分进行插入操作,所以有先进先出之说。我们知道数组的主要功能是查找功能,增删改对于数组而言相对于链表进行增删改是比较麻烦的,但是用来实现增删改操作还是可行的。
首先我们得考虑一个问题,就是在队列为空时出队操作和取队首元素操作时都是不合理的,此时会产生异常,所以我们自定义一个异常;
自定义异常:
package cn.jxlg.seq;
/**
* 队列为空时,出队或取队首元素时抛出此异常
*/
public class QueueEmptyException extends RuntimeException{
public QueueEmptyException(String err){
super(err);
}
}
然后就是完成队列中各种常用到的操作,我们可以先定义一个接口,使得代码更加的安全
接口的定义:
package cn.jxlg.seq;
/**
* 队列的功能接口
*/
public interface Queue {
//获取元素的大小
public int getSize();
//判断队列是否为空
public boolean isEmpty();
//入队
public void enqueue(Object obj);
//出队
public Object dequeue() throws QueueEmptyException;
//获取首元素
public Object peek() throws QueueEmptyException;
}
接口的功能实现:
public class Queue {
private int[] arr;//队
private int length;//队的长度
private int size;//队的当前长度
public Queue(){
arr=new int[5];
this.length=5;
}
public Queue(int length){
arr=new int[length];
this.length=length;
}
//验证
public void check(){
if (size>=length){
int [] newArr=new int[length+10];
System.arraycopy(arr,0,newArr,0,length);
arr=newArr;
length+=10;
}
}
//入队
public void add(int num){
check();
arr[size]=num;
size++;
}
//出队
public int remove(){
int num=arr[0];
for (int i=0;i<size-1;i++){
arr[i]=arr[i+1];
}
arr[size-1]=0;
size--;
return num;
}
//获取当前队的长度
public int size(){
return size;
}
}