队列操作
队列操作特点是先进先出,队列的删除只能操作头,插入只能操作尾。可以用一个数组存放数据,设计一个指针指向头一个指针指向尾,插入的时候调整尾指针,删除的时候移动头。同时增加了数组扩容和清除数组前面的多余空间。
本例子中添加了泛型,适用于任何数据类型。栈操作也可以按进行添加。看过一个面试题将字符串倒序排列,这里就可以使用栈来实现。
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();
}
}
测试类
public class Test {
public static void main(String[] args) {
HeapArrays<Integer> demo = new HeapArrays<>(5);
for(int i = 0;i<6;i++){
demo.insert(i);
System.out.println("队列的内容:"+demo.toString());
}
System.out.println("队列的长度:"+demo.length());
for(int i = 0;i<6;i++){
System.out.println("队列的数为:"+demo.get());
System.out.println("队列的内容:"+demo.toString());
}
}
}
测试结果:
队列的内容:0,
队列的内容:0,1,
队列的内容:0,1,2,
队列的内容:0,1,2,3,
队列的内容:0,1,2,3,4,
队列已满,自动扩容
队列的内容:0,1,2,3,4,5,
队列的长度:6
队列的数为:0
队列的内容:1,2,3,4,5,
取出队列的数为:1
队列的内容:2,3,4,5,
取出队列的数为:2
队列的内容:3,4,5,
取出队列的数为:3
队列的内容:4,5,
取出队列的数为:4
队列的内容:5,
取出队列的数为:5
队列的内容: