动态数组实现队列
1 什么是队列
队列:指的就是我们在现实的生活中,假如我们去取快递在一个固定快递接受站里,先来的人总是第一个拿到快递,然后来的人,依次排队,等到了自己的时候才能拿到自己的快递,这样的结构就可以称为队列。
队列 (queue) 是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称:FIFO,允许插入的一端称为队尾,允许删除的一端称为队头。假设队列是 q=(a1, a2,…, an) , 那么a1 就是队头的元素,这样我们删除时,总是可以从a1 开始,而插入时,从队尾开始。如下图所示:

2 队列的抽象数据类型
队列也是线性表,所以说队列也有类似于线性表的各种操作,不同的是插入数据时只能在队尾进行,删除数据时只能在队尾进行。
public int getSize();
public boolean isEmpty();
public void clear();
/**
* 入队一个新的的元素
* @param e
*/
public void enqueue(E e);
/**
* 出队列
* @return
*/
public E dequeue();
/**
* 获取队首元素(不删除)
* @return
*/
public E getFront();
/**
* 获取队尾元素
* @return
*/
public E getRear();
队列的定义:
public interface Queue<E>
我们知道队列也是一种特殊的线性表结构,所以队列的操作也可以直接调用list.方法进行完成。
队列的入队和出队操作
/**
*入队
*/
public void enqueue(E e) {
list.addLast(e);
}
/**
*出队
*/
public E dequeue() {
// TODO Auto-generated method stub
return list.removeFirst();
}
循环队列
定义:
循环队列怎么产生的,我们使用普通的队列时,出队一个元素,其他的元素都向前移动,这样它的时间复杂度就提高了,所以使用循环列表来降低它的时间复杂度。
设计 :
每一次在增加或者出队时都是直接出队不用,所有的元素进行前移,这样就降低了时间复杂度,我们浪费了一个空间用来存放尾指针。如下图所示。

循环队列的实现
定义:public class ArrayQueueLoop<E> implements Queue<E>
成员变量:
private E[] data;
private int front; //头指针
private int rear; //尾指针
private int size; 元素的个数
private static int DEFAULT_SIZE = 11; //默认的大小
默认大小:我们浪费了一个空间,当我们要存10个是,它的大小就应该多一个,所以他的默认大小是11。
构造函数 :
public ArrayQueueLoop() {
data = (E[]) new Object[DEFAULT_SIZE];
front = 0;
rear = 0;
size = 0;
}
public ArrayQueueLoop(int capacity) {
data = (E[]) new Object[capacity+1];
front = 0;
rear = 0;
size = 0;
}
队列——入队操作
@Override
public void enqueue(E e) {
if((rear+1)%data.length == front){
resize(data.length*2-1);
}
data[rear] = e;
rear = (rear + 1) % data.length;
size++;
}
** 队列——出队操作**
public E dequeue() {
if(isEmpty()){
throw new NullPointerException();
}
E e = data[front];
front = (front+1) % data.length;
size--;
if(size < data.length/4 && data.length > DEFAULT_SIZE){
//缩容
resize(data.length/2+1);
}
return null;
}

被折叠的 条评论
为什么被折叠?



