队列 
 :只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出 
 FIFO(First In First Out) 入队列:进行插入操作的一端称为 
 队尾( 
 Tail/Rear 
 )  
 出队列:进行删除操作的一端称为 
 队头  
 ( 
 Head/Front 
 )  
 
 
 
 
  在 
  Java 
  中, 
  Queue 
  是个接口,底层是通过链表实现 
  的 
 
 
  
 
 
 | 方法 | 功能 | 
| boolean offer(E e) | 入队列 | 
| E poll() | 出队列 | 
| peek() | 获取队头元素 | 
| int size() | 获取队列中有效元素个数 | 
| boolean isEmpty() | 检测队列是否为空 | 
 
   注意: 
   Queue 
   是个接口,在实例化时必须实例化 
   LinkedList 
   的对象,因为 
   LinkedList 
   实现了 
   Queue 
   接口。 
  
 
   
   
   
   队列的模拟实现 
  
 
   
  
 
  public class Queue {
    // 双向链表节点
    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;
            // last = newNode;
        }else{
            last.next = newNode;
            newNode.prev = last;
            // last = newNode;
        }
        last = newNode;
        size++;
    }
    // 出队列---将双向链表第一个节点删除掉
    public int poll(){
    // 1. 队列为空
    // 2. 队列中只有一个元素----链表中只有一个节点---直接删除
    // 3. 队列中有多个元素---链表中有多个节点----将第一个节点删除
        int value = 0;
        if(first == null){
            return null;
        }else if(first == last){
            last = null;
            first = null;
        }else{
            value = first.value;
            first = first.next;
            first.prev.next = null;
            first.prev = null;
        }
        --size;
        return value;
    }
    // 获取队头元素---获取链表中第一个节点的值域
    public int peek(){
        if(first == null){
            return null;
        }
        return first.value;
    }
    public int size() {
        return size;
    }
    public boolean isEmpty(){
        return first == null;
    }
} 
   
   循环队列  
  
 
   
  
 
   
     如何区分空与满 
    
 
     
    - 通过添加 size 属性记录
 - 保留一个位置
 - 使用标记
 
 
    
     双端队列 
      (Deque) 
    
 
     
     
     双端队列( 
     deque 
     )是指允许两端都可以进行入队和出队操作的队列, 
     deque  
     是 
      “double ended queue”  
     的简称。 那就说明元素可以从队头出队和入队,也可以从队尾出队和入队。 
    
 
     
    
 
     
      Deque 
      是一个接口,使用时必须创建 
      LinkedList 
      的对象。  
     
 
      
     
 
      
       在实际工程中,使用 
       Deque 
       接口是比较多的,栈和队列均可以使用该接口。  
      
 
       
      Deque<Integer> stack = new ArrayDeque<>();//双端队列的线性实现
Deque<Integer> queue = new LinkedList<>();//双端队列的链式实现 
        
      

















