**队列:**是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
附上代码:
/**
*
* @author springwave
*
*/
public class MyQueue<E> {
//队列的底层使用数组来存放元素,数组的头为队列的头,数组的尾为队列的尾(先进先出)
private Object[] elements;
public MyQueue() {
elements = new Object[0];
}
//向队列中插入一个元素
public void add(E e) {
//创建一个新数组
Object[] newArr = new Object[elements.length+1];
//将原来数组中的元素拷贝到新数组中
for (int i = 0; i < elements.length; i++) {
newArr[i] = elements[i];
}
//向新数组中添加需要插入的元素
newArr[elements.length] = e;
//使用新数组替换旧数组
elements = newArr;
}
//获取并移除此队列的头
@SuppressWarnings("unchecked")
public E poll() {
if (elements.length == 0) {
throw new RuntimeException("queue is empty!");
}
//得到数组的第一个元素(即队列的头)
E element = (E) elements[0];
//创建一个新数组
Object[] newArr = new Object[elements.length-1];
//将原数组中除了第一个元素外的其余元素拷贝到新数组中
for (int i = 1; i < elements.length; i++) {
newArr[i-1] = elements[i];
}
//用新数组替换旧数组
elements = newArr;
return element;
}
//查看此队列的头(不移除)
@SuppressWarnings("unchecked")
public E peek() {
if (elements.length == 0) {
throw new RuntimeException("queue is empty!");
}
//获取数组的第一个元素(即队列的头)
E element = (E) elements[0];
return element;
}
//判断队列是否为空
public boolean isEmpty() {
return elements.length == 0;
}
}
测试代码:
public class MyQueueTest {
public static void main(String[] args) {
MyQueue<String> queue = new MyQueue<>();
queue.add("111");
queue.add("222");
queue.add("333");
System.out.println(queue.poll());
System.out.println(queue.poll());
System.out.println(queue.poll());
queue.isEmpty();
queue.peek();
}
}
运行结果: