队列
1.队列的概念
只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性
进行插入操作的一端称为队尾(入队列)
进行删除操作的一端称为队头(出队列)
2.队列的使用
2.1队列的实例化
Queue<T> queue = new LinkedList<T>();//实例化一个元素类型为T的队列
2.2队列的方法
方法 | 功能 |
---|---|
offer(x) | 将x入队,且返回是否入队成功(返回boolean) |
poll() | 将队头出队 |
peek() | 获取队头元素 |
size() | 返回队列的长度(返回int) |
isEmpty() | 判断队列是否为空(返回boolean) |
2.3队列使用范例
public class Test {
public static void main(String[] args) {
Queue<Integer> queue = new LinkedList<Integer>();//实例化一个元素类型为T的队列
System.out.println(queue.offer(1));//入队1,且返回true
queue.offer(2);
queue.offer(3);
queue.poll();//将1出队,此时队头是2
System.out.println(queue.peek());//打印队头元素,是2
System.out.println(queue.size());//打印队列长度,是2
System.out.println(queue.isEmpty());//打印队列是否为空,false
}
}
2.队列的实现
在java中,Queue是一个接口,底层是通过链表实现的
虽然实现队列我们既可以用顺序结构也可以用链式结构,但是根据队列这种一头进,另一头出的特性,我们最好采用的是有队头指针和队尾指针的双端链表结构实现
进行模拟实现
public class MyQueue {
// 双向链表节点
public static class ListNode{
ListNode next;//后继
ListNode prev;//前驱
int value;
ListNode(int value){
this.value = value;
}
}
ListNode first; // 队头
ListNode last; // 队尾
int size = 0;//记录链表长度
// 入队列
public void offer(int e){
ListNode newNode = new ListNode(e);
//判断是否为空队列
if(first == null){
first = newNode;
}else{
last.next = newNode;
newNode.prev = last;
}
last = newNode;
size++;//入队列后队列长度要加1
}
// 出队列---将双向链表第一个节点删除掉
public void poll(){
int value = 0;
//队列为空
if(first == null){
return;
//队列中只有一个元素----链表中只有一个节点---直接删除
}else if(first == last){
last = null;
first = null;
//队列中有多个元素---链表中有多个节点----将第一个节点删除
}else{
value = first.value;
first = first.next;
first.prev.next = null;
first.prev = null;
}
--size;
}
// 获取队头元素---获取链表中第一个节点的值域
public int peek(){
if(first == null){
return -1;
}
return first.value;
}
//获得队列长度
public int size() {
return size;
}
//判断队列是否为空
public boolean isEmpty(){
return first == null;
}
}