一、队列的简介
队列是一种常用的数据结构之一,与之前的栈类似,不过队列是“先进先出” 类似平时排队先排的优先(栈则类似于弹簧,压子弹,最后压进去的子弹先射出 先进后出),是一种特殊的线性表,进行插入操作的端称为队尾,进行删除操作的端称为队头,特殊之处在于它只允许在表的队头进行删除操作,而在表的队尾进行插入操作,和栈一样,队列是一种操作受限制的线性表。
可以通过数组、集合、堆栈实现队列,在这里使用数组进行实现。
二、实现
原理图:
(1)自定义自己的队列
public class Queue<T> {
/**
* 定义一个数组来实现队列
*/
Object[] arr;
/**
* 数组最后可连续存值的数组下标,也就是数组长度
*/
int lastIndex = 0;
/**
* 指定容量
*/
int capacity;
public Queue(int capacity) {
arr = new Object[capacity];
this.capacity=capacity;
}
/**
* 入队
* @param t
*/
public void in(T t){
arr[this.lastIndex++] = t;
}
/**
* 返回队列的头,如果为空返回null
* @return
*/
public T peek() {
if(this.lastIndex<=0) {
return null;
}
return (T)arr[0];
}
/**
* 出队 获得元素并移出队列
*/
public T out(){
if(this.lastIndex<=0) {
System.out.println("队列为空");
return null;
}
//每次都取下标为0的值,则取得就是当前数组最先入队的值
T arrFristValue = (T)arr[0];
//去完下标为0后,把数组的值全部向前移,方便下次出队。3个值 lastIndex=4
for(int j=0;j<this.lastIndex;j++){
arr[j] = arr[j+1];
}
//每次出队一个值,可添加值的数组下标的值减一
this.lastIndex--;
return arrFristValue;
}
/**
* 队列大小
* @return
*/
public int size() {
return this.lastIndex;
}
/**
* 队列是否为空
* @return
*/
public boolean isEmpty() {
return this.lastIndex<=0;
}
/**
* 如何高效的查询数组中是否包含呢有很多种 经测试数组长度小于100的情况下 loop是最快的 (可以自己测试,在这里不分享啦)
* 是否包含
* @param t
* @return
*/
public boolean contains(T t) {
for (Object o : arr) {
//注意:这里要使用 == (equals和==的区别,自己了解)
if ((T) o==t) {
return true;
}
}
return false;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if(arr==null||arr.length<=0) {
return null;
}
sb.append("队列值:");
for (int i=0;i<this.lastIndex;i++) {
sb.append(arr[i]);
if(i!=this.lastIndex) {
sb.append(",");
}
}
return sb.toString();
}
}
(2)测试:
@Test
public void queueTest() {
//测试队列
System.out.println("测试队列:");
Queue<Integer> queue = new Queue<>(10);
queue.in(1);
queue.in(2);
queue.in(3);
System.out.println("出队:"+queue.out());
queue.in(4);
System.out.println("是否包含4:"+queue.contains(4));
System.out.println(queue.toString());
}
(3)运行结果
生如蝼蚁当立鸿鹄之志,命薄如纸应有不屈之心。