1.1 队列Queue
进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头 (Head/Front)。
先进先出
1.2基本操作
boolean offer(E e) 入队列
E poll() 出队列
peek() 获取队头元素
int size() 有效长度
boolean isEmpty() 判断是否为空
Queue是个接口,底层是通过链表实现的。
public static void main(String[] args) {
Queue<Integer> q = new LinkedList<>();
q.offer(1);
q.offer(2);
q.offer(3);
q.offer(4);
q.offer(5); // 从队尾入队列
System.out.println(q.size());
System.out.println(q.peek()); // 获取队头元素
q.poll();
System.out.println(q.poll()); // 从队头出队列,并将删除的元素返回
if(q.isEmpty()){
System.out.println("队列空");
}else{
System.out.println(q.size());
}
}
1.3队列的存储结构
(1)顺序存储结构
public class MyQueue<E> {
public static class Node<E>{
private E value;
private Node<E> next;
public Node(E val){
value = val;
next = null;
}
}
Node<E> front; // 标记队头
Node<E> back; // 标记队尾
int size;
//入队列
public boolean offer(E e){
Node<E> node = new Node<>(e);
if(null == front){
front = node;
}else{
back.next = node;
}
back = node;
size++;
return true;
}
//出队列
public E poll(){
if(0 == size){
throw new RuntimeException("队列为空,无法出队列");
}
Node<E> delNode = front;
front = front.next;
if(null == front){
back = null;
}
size--;
return delNode.value;
}
//获取首队列元素
public E peek(){
if(0 == size){
throw new RuntimeException("队列为空,无法获取队头元素");
}
return front.value;
}
//判断是否为空
public boolean isEmpty(){
return 0 == size;
}
//长度
public int size(){
return size;
}
}
(2)循环队列
头尾相连的顺序存储结构即为循环队列