什么是队列
队列是一种只允许在表的前端进行删除操作且在表的后端进行插入操作的线性表。其中,执行插入操作的端叫作队尾,执行删除操作的端叫作队头。没有元素的队列叫作空队列,在队列中插入一个队列元素叫作入队,从队列中删除一个队列元素叫作出队。因为队列只允许在队尾插入,在队头删除,所以最早进行队列的元素将最先从队列中删除,所以队列又叫作 先进先出(FIFO) 的线性表。
核心方法:
- add():向队列的尾部加入一个元素(入队),先入队列的元素在最前边。
- poll():删除队列头部的元素(出队)。
- peek():取出队列头部的元素。
代码实现
package datastructure;
import java.util.Arrays;
import java.util.stream.Stream;
public class Queue<E> {
private Object[] data = null;
private int maxSize = 0;//队列的容量
private int front;//队列头,允许删除
private int rear;//队列尾,允许插入
public Queue() {
this(10);
}
public Queue(int initialSize) {
if(initialSize < 0){
throw new RuntimeException("初始化大小不能小于0:"+initialSize);
}
this.maxSize = initialSize;
data = new Object[initialSize];
front = rear = 0;
}
/**
* 向队列的尾部插入数据
* @param e
* @return
*/
public boolean push(E e){
if(rear == maxSize){
throw new RuntimeException("队列已满,无法插入新的元素");
}
data[rear++] = e;
return true;
}
/**
* 删除队列头部的元素,出队
* @return
*/
public E poll(){
if(empty()){
throw new RuntimeException("空队列异常");
}
E value = (E)data[front];
data[front++] = null;
return value;
}
/**
* 取出队列头部的元素,不删除
* @return
*/
public E peek(){
if(empty()){
throw new RuntimeException("空队列异常");
}
return (E)data[front];
}
public boolean empty(){
if(data == null){
return false;
}
return Stream.of(data).allMatch(p->null!=p);
}
public static void main(String[] args) {
Queue<Integer> queue = new Queue<>();
queue.push(1);
queue.push(2);
queue.push(3);
System.out.println("数组元素:"+ Arrays.toString(queue.data));
System.out.println("删除队列头部数据:"+queue.poll());
System.out.println("数组元素:"+ Arrays.toString(queue.data));
System.out.println("查询队列头部数据:"+queue.peek());
queue.push(4);
System.out.println("数组元素:"+ Arrays.toString(queue.data));
}
}
执行结果: