1. 队列的定义:队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
1>. 我们把允许删除的一端称为队首,插入的一端称为队尾。
2>. 不含任何数据元素的队列称为空队列。
3>. 队列是一种先进先出的线性表,简称FIFO。
4>. 队列本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已。
5>. 队列的插入操作,叫作入队;队列的删除操作,叫作出队。
2. 队列接口的定义:队列可以顺序存储实现也可以链表存储实现,所以将共性抽取定义出Queue接口。
public interface Queue<E> extends Iterable<E>{
//相队尾添加元素
public void offer(E element);
//删除队首元素
public E poll();
//查看队首元素
public E element();
//判断队列是否为空
public boolean isEmpty();
//清空队列中的所有元素
public void clear();
//获取队列中有效元素的个数
public int size();
}
3. 队列接口的实现类:该类为队列的顺序存储具体实现,因为队列本身就是一种特殊的线性表,所以我们可以借用之前完成的ArrayList来实现我们的ArrayQueue。
public class ArrayQueue<E> implements Queue<E> {
//队列的实现 底层我们还是通过列表来实现队列
private ArrayList<E> list; //存放数据的容器
public ArrayQueue(){
list = new ArrayList<>();
}
//相队尾添加元素
@Override
public void offer(E element) {
list.add(list.size(), element);
}
//删除队首元素
@Override
public E poll() {
return list.remove(0);
}
//查看队首元素
@Override
public E element() {
return list.get(0);
}
//判断队列是否为空
@Override
public boolean isEmpty() {
return list.isEmpty();
}
//清空队列中的所有元素
@Override
public void clear() {
list.clear();
}
//获取队列中有效元素的个数
@Override
public int size() {
return list.size();
}
//获取当前这个数据结构/容器 的 迭代器
//通过迭代器对象 更方便挨个取出每一个元素
//同时 实现了Iterable 可以让当前的数据结构/容器 被foreach循环遍历
@Override
public Iterator iterator() {
return list.iterator();
}
//判断指定队列 与 当前队列是否相等
public boolean equals(Object o){
//先判空
if(o == null){
return false;
}
//判断是否是自己
if(this == o){
return true;
}
//判断类型是否一样
if(o instanceof ArrayQueue){
ArrayQueue<E> other = (ArrayQueue<E>) o;
return this.list.equals(other.list);
}
return false;
}
//规定队列输出的格式
public String toString(){
StringBuilder str = new StringBuilder();
str.append("ArrayQueue: " + size() + "/" + list.capacity() + " [");
if(isEmpty()){
str.append(']');
}
for (int i = 0; i < size(); i++){
str.append(list.get(i));
if(i == size() - 1){
str.append(']');
}else{
str.append(',');
str.append(' ');
}
}
return str.toString();
}
}