队列
- 队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
- 结构如下图所示
2.队列的特点
- 线性表:链表或者数组
-
数组实现队列基本操作
数组可以用到CPU高速缓存,某种情况下效率比链表好
数组实现,存在空间浪费问题
```java /**
- @author lfy
@date 2022-03-07 */ public class MyQueue
implements Queue { private E[] data; private int head; private int tail; private int n;
public MyQueue(int capacity) {
this.data = (E[])new Object[capacity];n=capacity;
}
@Override public void push(E e) {
data[tail] = e;tail++;
}
@Override public E pop() {
if (isEmpty()){return null;}E e = data[head];head++;return e;
}
@Override public boolean isEmpty() {
return head == tail;
} }
<a name="EErmc"></a>#### 循环数组实现```java/*** @author lfy* @date 2022-03-07*/public class MyCycleArrayQueue<E> implements Queue<E>{private E[] data;private int head;private int tail;private int n;public MyCycleArrayQueue(int capacity) {this.data = (E[])new Object[capacity];n=capacity;}@Overridepublic void push(E e) {if ((tail+1) % n == head) {return;}data[tail] = e;tail = (tail+1) % n;}@Overridepublic E pop() {if (isEmpty()) {return null;}E e = data[head];head = (head+1)%n;return e;}@Overridepublic boolean isEmpty() {return head == tail;}}
阻塞队列:
- 此种具有特殊特性的队列应用却比较广泛,比如阻塞队列和并发队列。阻塞队列其实就是在队列基础上增加了阻塞操作。简单来说,就是在队列为空的时候,从队头取数据会被阻塞。因为此时还没有数据可取,直到队列中有了数据才能返回;如果队列已经满了,那么插入数据的操作就会被阻塞,直到队列中有空闲位置后再插入数据,然后再返回。
