队列
**队列(queue)是只容许在一端进行插入操作,而在另一端进行删除操作的线性表,即先进先出。**容许插入的一端为队尾,容许删除的一端称为对头。
顺序储存
每在数组头部即对头删除一次时间复杂度就是O(n)。设法通过移动下标而不移动元素降低时间复杂度。
循环队列
那么头尾相接的顺序存储结构就是循环链表。
- 队列满的条件是
(tail+1)%max== head
/**
* <p>Title: QueueArray.java</p>
* <p>Description: 循环队列:先入先出</p>
* @version 1.0
*/
public class QueueArray<E> {
// 容器
private Object[] list;
// 队列头
private int head;
// 队尾
private int tail;
// 当前队列长度
private int lenght;
// 最大长度
private int max;
// 检索并删除队列的头
public E remove() {
if (lenght <= 0) {
throw new IllegalStateException("没东西了");
}
@SuppressWarnings("unchecked")
E ele = (E)list[head];
if (ele == null) {
return null;
}
list[head++] = null;
lenght--;
return ele;
}
// 检索但是不删除队列的头
@SuppressWarnings("unchecked")
public E peek() {
return (E) list[head];
}
// 入队:队列尾进入
public E push(E e) throws Exception {
if (e == null) {
throw new Exception("喂,你传的东西有问题");
}
if (lenght != 0&& tail!=head) {
// 保留一个元素空间,当tail到达head前时一格队列满
if ((tail+1)%max == head) {
throw new Exception("队列满了,不要了");
}
}
// 循环
if (tail== max-1) {
if (head!=0) {
list[tail++] = e;
if (tail == max) {
tail =0;
}
}
}else {
list[tail++] = e;
}
lenght++;
return e;
}
@Override
public String toString() {
return "QueueArray [list=" + Arrays.toString(list) + ", head=" + head + ", tail=" + tail + ", lenght=" + lenght
+ ", max=" + max + "]";
}
public QueueArray(int max) {
this.max = max;
this.head = 0;
this.tail = 0;
this.lenght = 0;
list = new Object[max];
}
private QueueArray() {
super();
}
}
链式储存
链队列就是队列的链式存储结构其实就是线性表的单链表,只不过是只能尾进头出。