定义:队列是 只允许在一端进行插入操作,而在另一端进行删除操作的线性表
- 插入的一端称为队尾,删除的一端称为对头
缺点:出栈复杂度高,容易造成假溢出:可能对头有很多空位置,此时插入放到了队尾,就可能造成溢出,此时叫做假溢出
解决办法:循环队列-把头尾相接的循序存储结构称为循环队列(可以解决假溢出) 队列的链式存储及结构模式:队列的链式存储及结构,其实就是线性表的单链表,只不过它只能头出尾进而已
Queue源码分析
public interface Queue<E> extends Collection<E> {
//将元素添加到这个队列中,但是如果没有可用空间,则抛出异常IllegalStateException
boolean add(E e);
//入队
boolean offer(E e);
//移除头部或者如果队列为空。则返回null
E remove();
//出队
E poll();
//如果为空,只抛出异常,检索头部
E element();
//检索头部但不删除
E peek();
}
看下LinkedList源码分析,之前写过一篇文章http://blog.csdn.net/qq_24675479/article/details/79542935这里就不阐述,直接看如何入队和出队
//入队
public boolean offer(E o) {
//之前分析过,不看源码了,这里就是将数据添加到末尾
return addLastImpl(o);
}
//出队
public E poll() {
//如果为空直接返回空,否则移除头部
return size == 0 ? null : removeFirst();
}
public E removeFirst() {
return removeFirstImpl();
}
private E removeFirstImpl() {
Link<E> first = voidLink.next;//首先获得头部的下一个指针,如01
if (first != voidLink) {//01不为空
Link<E> next = first.next;//获得01的下一个指针如02
voidLink.next = next;//将头部的下个指针指向02
next.previous = voidLink;//02的前一个指针指向头部
size--;//大小-1
modCount++;
return first.data;
}
throw new NoSuchElementException();
}