队列
- 队列是一种特殊的线性表,只能在头尾两端进行操作
- 队尾(rear):只能从队尾添加元素,一般叫做 enQueue,入队
- 队头(front):只能从队头移除元素,一般叫做 deQueue,出队
- 先进先出的原则,First In First Out,FIFO
- java官网的Queue是一个接口,具体实现是双向链表LinkedList
示意图
队列的接口设计
方法声明 | 功能介绍 |
---|---|
int size() | 元素的数量 |
boolean isEmpty() | 是否为空 |
void clear() | 清空 |
void enQueue(E element) | 入队 |
E deQueue() | 出队 |
E front() | 获取队列的头元素 |
具体实现
队列优先使用双向链表,因为队列主要是往头尾操作元素。
public class Queue<E> {
//该双向链表由自定义完成,官网LinkedList也是双向链表
private DoubleLinkedList<E> list=new DoubleLinkedList<>();
public int size(){
return list.size();
}
public boolean isEmpty(){
return list.isEmpty();
}
/**
* 入队
* @param element
*/
public void enQueue(E element){
list.add(element);
}
/**
* 出队
* @return 出队元素
*/
public E deQueue(){
return list.remove(0);
}
/**
* 队首元素
* @return
*/
public E front(){
return list.get(0);
}
public void clear(){
list.clear();
}
}
双端队列
- 双端队列是能在头尾两端添加、删除的队列
- 英文 deque 是 double ended queue 的简称
- java官网的Deque仍是一个接口,具体实现是双向链表LinkedList
示意图
接口设计
int size() | 元素的数量 |
boolean isEmpty() | 是否为空 |
void clear() | 清空 |
void enQueueRear(E element) | 从队尾入队 |
E deQueueFront() | 从队头出队 |
void enQueueFront(E element) | 从队头入队 |
E deQueueRear() | 从队尾出队 |
E front() | 获取队列的头元素 |
E rear() | 获取队列的尾元素 |
具体实现
/**
* 双端队列
*/
public class Deque<E> {
//创建自定义的双向链表
private DoubleLinkedList<E> list=new DoubleLinkedList();
public int size(){
return list.size();
}
public boolean isEmpty(){
return list.isEmpty();
}
/**
* 头部进队
*/
public void enQueueFront(E element){
list.add(0,element);
}
/**
* 尾部进队
* @param element
*/
public void enQueueRear(E element){
list.add(element);
}
/**
* 头部出队
* @return
*/
public E deQueueFront(){
return list.remove(0);
}
/**
* 尾部出队
* @return
*/
public E deQueueRear(){
return list.remove(list.size()-1);
}
/**
* 头部元素
* @return
*/
public E front(){
return list.get(0);
}
/**
* 尾部元素
* @return
*/
public E rear(){
return list.get(list.size()-1);
}
/**
* 清空双端队列
*/
public void clear(){
list.clear();
}
}
其中双向链表见:链表(二)用Java语言实现双向链表