引言
前面介绍了栈数据存储类型,下面接着介绍队列数据存储类型。队列和栈一样也被用作程序员的工具。队列也是一种数据结构,有点类似栈,只是在队列中第一个插入的数据项也会最先被移除,先进先出。队列的作用就像人们排队买东西,第一个排队的人对于后面的人来说就是队头,队伍最后一个人对于整个队伍来说就是队尾。
现实排队中,当前一个人买完东西离开队伍后,其他人都向前移动。但是在计算机中,虽然也可以删除一个队头的数据项,后面的数据项都向前移动,但是这样效率很差。所以我们加入队头和队尾的坐标指针,是指针移动来保持所有的数据项位置不变,来区分队头和队尾。
这样会出现,队尾的指针已经不能向后移动,但是队头的数据已经移除,队列不满但是不能插入新的数据项问题。所以为了避免队列不满去不能插入新数据项问题,可以让队头队尾指针环绕到数组开始的位置。这就是循环队列。
/**
* 简单队列
* @author whmAdmin
*
*/
public class Queue {
private int maxSize; //最大元素数量
private long[] queArray;// 队列数组
private int front;//队头位置
private int rear;//队尾位置
private int nItems;// 当前数据项个数
/**
* 初始化队列
* @param s 队列大小
*/
public Queue(int s) {
maxSize = s;
queArray = new long[maxSize];
front = 0;
rear = -1;
nItems = 0;
}
/**
* 队列插入元素
* @param j 元素
*/
public void insert(long j){
if(rear == maxSize - 1) {
rear = -1;
}
queArray[++rear] = j;
nItems++;
}
/**
* 删除元素
* @return
*/
public long remove() {
long temp = queArray[front++];
if(front == maxSize) {
front = 0;
}
nItems--;
return temp;
}
//获取当前头元素
public long peekFront() {
return queArray[front];
}
public boolean isEmpty() {
return (nItems == 0);
}
public int size() {
return nItems;
}
public static void main(String[] args) {
Queue queue = new Queue(6);
queue.insert(10);
queue.insert(20);
queue.insert(30);
queue.insert(40);
queue.insert(50);
queue.remove();
queue.remove();
queue.remove();
queue.insert(60);
queue.insert(70);
queue.insert(80);
queue.insert(90);
while (!queue.isEmpty()) {
long n = queue.remove();
System.out.print(n);
System.out.print(" ");
}
System.out.println("");
}
}
运行结果:
40 50 60 70 80 90
但是这样还会出现,当队列满的时候,front和rear指针取一定的位置,但是当队列为空时,也可能呈现相同的位置关系。于是在同一时间,队列似乎可能是满的,也可能是空的。所以需要让数组的容量比队列数据项个数的最大值还要大一。