队列是一种特殊的线性表,是一种先进先出(FIFO)的数据结构。它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
数组模拟实现队列
用数组模拟队列实现部分方法。
/**
* 数组实现队列
*/
public class MyQueue<E> {
private E[] datas;
private int putIndex;//存数据的下标
private int getIndex;//取数据的下标
private int numbers;//记录数据的个数
/**
* 空参构造
*/
public MyQueue() {
}
/**
* 构造
* @param size
*/
public MyQueue(int size) {
if (size < 1) {
throw new RuntimeException();
}
datas = (E[]) new Object[size];
}
/**
* 判断队列是否已满
* @return true 已满
* false 未满
*/
public boolean isFull(){
return numbers == datas.length;
}
/**
* 获取队列中元素的数量
*/
public int size() {
return numbers;
}
/**
* 判断队列是否为空
*/
public boolean isEmpty() {
return numbers == 0;
}
/**
* 添加数据
*/
public boolean add(E e) {
//判断队列是否满
if (isFull()) {
return false;
}
//添加数据
datas[putIndex % datas.length] = e;
putIndex ++;
//记录数据个数
numbers ++;
return true;
}
/**
* 获取并移除此队列的头元素
* @return
*/
public E poll() {
//移除数据
E data = datas[getIndex % datas.length];
numbers --;
getIndex ++;
return data;
}
}
链表模拟实现队列
用双链表模拟队列实现部分方法。
/**
* 链表实现队列
*/
public class MyQueueLink<E> {
//自定义双链表,具体实现在数据结构(五)中
private MyDoubleLink<E> datas = new MyDoubleLink<E>();
/**
* 判断队列是否为空
* @return
*/
public boolean isEmpty() {
//返回链表是否为空
return datas.isEmpty();
}
/**
* 将指定的元素插入此队列
* @param e
* @return
*/
public boolean add(E e) {
//从链表的尾部添加数据
datas.add(e);
return true;
}
/**
* 获取并移除此队列的头元素
* @return
*/
public E poll() {
//获取并移除双链表中的头元素
E data = datas.removeHead();
return data;
}
}