队列的实现
队列的定义
队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表
- 我们把允许删除的一端称为队首(front),插入的一端称为队尾(rear)
- 不含任何数据元素的队列称为空队列
- 队列是一种先进先出(First In First Out)的线性表,简称FIFO
- 队列本身是一个线性表,其数据元素具有线性关系,只不过它是一种特殊的线性表而已
- 队列的插入操作,叫作入队
- 队列的删除操作,叫作出队
Queue队列接口的定义
队列可以顺序存储实现也可以链表存储实现所以将共性抽取定义出Queue接口
public interface Queue<E> extends Iterable<E>{
public int size();
public boolean isEmpty();
public void offer(E element); //入队
public E poll(); //出队
public E element(); //查看队首元素
public void clear();
}
ArrayQueue类的定义
public class ArrayQueue<E> implements Queue<E> {
private ArrayList<E> list;
public ArrayQueue(){
this(10);
}
public ArrayQueue(int capacity){
list = new ArrayList<>(capacity);
}
//获取队列中有效元素的个数
@Override
public int size() {
return list.size;
}
//判断队列是否为空
@Override
public boolean isEmpty() {
return list.isEmpty();
}
//入队一个元素
@Override
public void offer(E element) {
list.add(element);
}
//出队一个元素
@Override
public E poll() {
return list.remove(0);
}
//获取队首元素
@Override
public E element() {
return list.get(0);
}
//清空队列元素
@Override
public void clear() {
list.clear();
}
@Override
public boolean equals(Object o){
if (o == null){
return false;
}if (this == o){
return true;
}if (o instanceof ArrayQueue){
ArrayQueue other = (ArrayQueue) o;
return list.equals(other.list);
}
return false;
}
@Override
public Iterator<E> iterator() {
return list.iterator();
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder(String.format("ArrayQueue:%d/%d[",size(),list.getCapacity()));
if (isEmpty()){
sb.append(']');
}else {
for (int i = 0; i < size(); i++) {
sb.append(list.get(i));
if (i != size() - 1){
sb.append(',');
}else {
sb.append(']');
}
}
}return sb.toString();
}
}