简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
Java模拟实现简单的队列
public class HeapArrays<T> {
//数组存储数据
private T[] data;
//队列的大小,默认10
private int maxSize = 10;
//队列的头指针
private int topPointer = 0;
//队列的尾指针
private int tailPointer = 0;
public HeapArrays(){
this.data = (T[]) new Object[maxSize];
}
public HeapArrays(int maxSize) {
this.maxSize = maxSize;
this.data = (T[]) new Object[maxSize];
}
/**
* 获取长度
* @return
*/
public int length(){
return tailPointer - topPointer;
}
/**
* 判断是否为空
* @return
*/
public boolean isEmpty(){
if(length()<1){
return true;
}else{
return false;
}
}
/**
* 存队列
* @param e
*/
public void insert(T n){
if (length()>=maxSize) {
System.out.println("队列已满,自动扩容");
this.maxSize = maxSize*2;
T[] data2 = (T[]) new Object[maxSize];
for(int i = 0;i<this.data.length;i++){
data2[i] = data[i];
}
this.data = data2;
}
data[tailPointer] = n;
//尾位置后移
tailPointer++;
}
/**
* 取队列
*/
public T get(){
//如果为空
if (isEmpty()) {
throw new RuntimeException("队列已空");
}
T first = data[topPointer];
//头位置后移
topPointer++;
if(topPointer>10){
T[] data2 = (T[]) new Object[maxSize];
for(int i = topPointer;i<=tailPointer;i++){
data2[i-topPointer] = data[i];
}
this.data = data2;
tailPointer-=11;
topPointer-=11;
}
return first;
}
public String toString(){
StringBuffer b = new StringBuffer();
for(int i = topPointer;i<tailPointer;i++){
b.append(data[i]+",");
}
return b.toString();
}
}
双边队列
我们可以把get()、insert()方法修改成getRight()、getLeft()和insertRight()、insertLeft()方法,这个队列的两头都可以插入和删除。
总结
栈允许在栈顶压入(插入)数据,在栈顶弹出(移除)数据,但是只能访问最后一个插入的数据项,也就是栈顶元素。
队列(单向队列)只能在队尾插入数据,对头删除数据,并且只能访问对头的数据。而且队列还可以实现循环队列,它基于数组,数组下标可以从数组末端绕回到数组的开始位置。