一、队列
队列
是一种特殊的线性表, 只能在头尾两端操作
队尾(rear): 只能从队尾添加
元素, 一般叫做enQueue
, 入队
对头(front): 只能从对头移除
元素, 一般叫做deQueue
, 出队
二、接口设计
int size () ;
boolean isEmpty () ;
void clear () ;
void enQueue (E element) ;
E deQueue () ;
E fornt () ;
队列的内部实现可以用动态数组
或链表
实现, 链表优先使用双向链表
三、队列实现
public class Queue<E> {
private LinkedList<E> list;
public Queue () {
list = new LinkedList<>();
}
public int size () {
return list.size();
}
public boolean isEmpty () {
return list.isEmpty();
}
public void clear () {
list.clear();
}
public void enQueue(E element) {
list.add(element);
}
public E deQueue () {
return list.remove(0);
}
public E fornt () {
return list.get(0);
}
}
四、双端队列
1、接口设计
int size () ;
boolean isEmpty () ;
void clear () ;
void enQueueRear (E element) ;
E deQueueFront () ;
void enQueueFront (E element) ;
E deQueueRear () ;
E fornt () ;
E rear () ;
2、双端队列实现
public class Deque <E > {
private LinkedList<E> list;
public Deque () {
list = new LinkedList<>();
}
int size () {
return list.size();
}
boolean isEmpty () {
return list.isEmpty();
}
void clear () {
list.clear();
}
void enQueueRear (E element) {
list.add(element);
}
E deQueueFront () {
return list.remove(0 );
}
void enQueueFront (E element) {
list.add(0 , element);
}
E deQueueRear () {
return list.remove(list.size() - 1 );
}
E fornt () {
return list.get(0 );
}
E rear () {
return list.get(list.size() - 1 );
}
}
五、循环队列
队列内部实现也可以用动态数组
实现, 并且将各项接口优化到O(1)
的时间复杂度, 这个用数组实现并优化之后的队列就叫做: 循环队列
使用一个索引变量front
控制第0
个元素所在位置, 每一次出栈, 就将front
位置的元素取出并删除, 然后front
向后+1
每一次入栈, 都根据front
和当前元素数量
计算出入栈元素应该存入的索引, 然后将元素存入到数组对应索引的位置上
1、接口设计
int size () ;
boolean isEmpty () ;
void clear () ;
void enQueue (E element) ;
E deQueue () ;
E fornt () ;
2、代码实现
public class CircleQueue <E > {
private int front;
private int size;
private E[] elements;
private static final int DEFAULT_CAPACITY = 10 ;
public CircleQueue () {
elements = (E[]) new Object[DEFAULT_CAPACITY];
}
public int size () {
return size;
}
public boolean isEmpty () {
return size == 0 ;
}
public void enQueue (E element) {
ensureCapacity(size + 1 );
elements[(front + size) % elements.length] = element;
size++;
}
private void ensureCapacity (int capacity) {
if (capacity <= elements.length) return ;
capacity = capacity + (capacity >> 1 );
E[] newElements = (E[]) new Object[capacity];
for (int i = 0 ; i < size; i++) {
newElements[i] = elements[(i + front) % elements.length];
}
elements = newElements;
front = 0 ;
}
public E deQueue () {
E element = elements[front];
elements[front] = null ;
front = (front + 1 ) % elements.length;
size--;
return element;
}
public E fornt () {
return elements[front];
}
public void clear () {
for (int i = 0 ; i < size; i++) {
elements[i] = null ;
}
size = 0 ;
front = 0 ;
}
}