1、 队列的定义
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表,LIFO。
2、队列的特点
- 线性表:链表或者数组
- FIFO
3、队列的分类
- 顺序(单向)队列:(Queue) 只能在一端插入数据,另一端删除数据
- 循环(双向)队列(Deque):每一端都可以进行插入数据和删除数据操作
4、队列的基本操作
队列跟栈非常相似,支持的操作也很有限,最基本的操作也是两个:
- 入队enqueue(),放一个数据到队列尾部;
- 出队dequeue(),从队列头部取一个元素。
所以,队列跟栈一样,也是一种操作受限的线性表数据结构。作为一种非常基础的数据结构,队列的应用也非常广泛,特别是一些具有某些额外特性的队列,比如循环队列、阻塞队列、并发队列。它们在很多偏底层系统、框架、中间件的开发中,起着关键性的作用。
5、基于数组的实现
public class ArrayQueue {
private int data[];
//头
private int head = 0;
//尾
private int tail = 0;
//数组的大小,最大的空间
private int n = 0;
//当前已经存在几个数了
private int size;
public ArrayQueue(int cap) {
this.data = new int[cap];
n = cap;
}
/**
* 入队列
* @param m
*/
public void push(int m) {
// 判断队列是不是已经满了
if (tail == n) {
//
return;
}
data[tail++] = m;
size++;
}
public int pop() {
if (isEmpty()) {
return -1;
}
//涉及到数组移动
return data[head++];
}
public boolean isEmpty() {
return head == tail;
}
public void show(){
System.out.println(Arrays.toString(data));
}
}