1. 概念
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性
特点: 队列具有先进先出FIFO(First In First Out)
入队列:进行插入操作的一端称为队尾(Tail/Rear)
出队列:进行删除操作的一端称为队头(Head/Front)
2. 队列的使用
在Java中,Queue是个接口,底层是通过链表实现的。
注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。
比如:Queue<Integer> q = new LinkedList<>();
Java中队列提供的一些使用方法如下:
方法 | 功能 |
---|---|
boolean offer(E e) | 入队列 |
E poll() | 出队列 |
peek() | 获取队头元素 |
int size() | 获取队列中有效元素个数 |
boolean isEmpty() | 检测队列是否为空 |
3. 模拟实现队列
我们可以使用双向链表来模拟实现队列
1. 首先创建一个内部类 ,定义节点,并采用构造方法初始化
static class QueNode{
public QueNode prev;
public QueNode next;
int val;
public QueNode(int val) {
this.val = val;
}
}
2. 定义两个引用分别指向队头和队尾
public QueNode front;
public QueNode rear;
3. 相关方法的实现
public class MyQueue {
static class QueNode{
public QueNode prev;
public QueNode next;
int val;
public QueNode(int val) {
this.val = val;
}
}
public QueNode front;
public QueNode rear;
//入队尾
public void offer(int data){
QueNode queNode=new QueNode(data);
if(front==null){
front=rear=queNode;
}else {
rear.next=queNode;
queNode.prev=rear;
rear=queNode;
}
}
//队头出数据
public void poll(){
int data=0;
if(front==null){
}else {
data=front.val;
front=front.next;
front.prev=null;
if(front==null){
rear=null;
}
}
return data;
}
// 求队长
public int size(){
if(front==null){
return 0;
}
QueNode cur=front;
int size=0;
while (cur!=null){
size++;
cur=cur.next;
}
return size;
}
//取队头元素
public int peek(){
if(front==null){
return -1;
}
return front.val;
}
//队列的打印
public void display(){
if(front==null){
return ;
}
QueNode cur=front;
while (cur!=null){
System.out.print(cur.val+" ");
cur=cur.next;
}
System.out.println();
}
}