队列
队列是一种只允许在表的前端进行删除操作且在表的后端进行插入操作的线性表。其中,执行插入操作的端叫作队尾,执行删除操作的端叫作队头。没有元素的队列叫作空队列,在队列中插入一个队列元素叫作入队,从队列中删除一个队列元素叫作出队。因为队列只允许在队头插入,在队尾删除,所以最早进入队列的元素将最先从队列
中删除,所以队列又叫作先进先出(FIFO) (first in first out)线性表。
具体数据结构如下:
方法 | 功能描述 |
---|---|
add() | 向队列尾部加一个元素(入队) |
poll() | 删除队前头的元素(出队) |
peek() | 取出队列头部的元素 |
我们来看看队列的数据结构:
public class Queue <E>{
private Object [] data=null;
private int maxSize;
private int front;
private int rear;
public Queue(){
this(10);
}
public Queue(int initalSize){
if(initalSize>=0){
this.maxSize=initalSize;
data=new Object[initalSize];
front=rear=0;
}else {
throw new RuntimeException("初始化大小不能小于0"+initalSize);
}
}
}
首先定义一个最大容量,头部和尾部指针,然后定义Object类型的data数组。
当front=rear=0时,队列是空队列。当有新数据加入时,rear指针加1,而rear指针不动。
向队列插入数据(add方法)
public boolean add(E e){
if(maxSize==rear){
throw new RuntimeException("队列已满,禁止插入数据");
}else{
data[rear++]=e;
return true;
}
}
当队尾加入数据时,队尾指针rear加一,一开始rear=0。
有新数据后,rear=1,那么我们可以得出data[rear++]=e
取走队列头部数据:
public E poll(){
if(empty()){
throw new RuntimeException("空队列异常")
}else{
E value=(E)data[front];
data[front++]=null;
return value;
}
}
先把data[front]取出来,再置null,最后front+1.
peek()类似
public E peek(){
if(empty()){
throw new RuntimeException("空队列异常")
}else{
E value=(E)data[front];
return value;
}
}