队列
队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是q = (a1,a2,…,an),那么a1就是队头元素,而an是队尾元素。这样我们就可以删除时,总是从a1开始,而插入时,列在最后,这也比较符合我们通常生活中的习惯,排在第一个的优先出列,最后来的当然排在队伍的最后,如图所示:
- 例如:入队:1,2,3,4,5;出队:1,2,3,4,5;
- 应用:键盘的输入输出
队列的存储结构
因为队列也是一种特殊的线性表,所以其存储结构有顺序结构和链式结构两种,其中链式结构又可以分为单向链表和双向链表。
- 顺序队列
- 相当于顺序表,以数组模拟,由于一方入队一方出队,所以只执行头插尾删或者尾插头删其中之一
- 头插 -> 当队满时需进行扩容同时需要移动数据 -> O(n); 尾删 -> 只需要释放内存并进行size-- -> O(1);
- 尾插 -> 只需进行size++ -> O(1); 头删 -> 删除0下标后同样需要移动数据 -> O(n);
- TODO:因此当使用顺序队列时我们选择头插尾删,或者尾插头删方法均可
代码实现:
public class MyOrderQueue<T> {
private T[] element;
private static final int initSize = 10; //数组初始大小
private int size; //记录有效个数
public MyOrderQueue(){
this(initSize);
}
public MyOrderQueue(int capacity){
this.element = (T[])new Object[capacity];
}
//判满操作
private boolean isFull(){
return size == element.length;
}
//判空操作
public boolean isEmpty(){
return size == 0;
}
//扩容操作
private void dilatation(){
element = Arrays.copyOf(element,element.length << 1);
}
//获取有效个数
public int getSize(){
return size;
}
//入队操作(头插尾删方法)
public void add(T value){
if(isFull()){
dilatation();
}
for(int i = size;i > 0;i--){
element[i] = element[i-1];
}
element[0] = value;
size++;
}
//出队操作(头插尾删方法)
public void remove(){
if(isEmpty()){
return;
}
element[--size] = null;
}
//获取队头元素(头插尾删方法)
public T