05、数据结构与算法 - 基础:队列(Qeque)

队列的定义

队列也是一种线性表,只能在头尾两端进行操作,主要特点:

  • 队尾:只能从队尾添加元素,叫做入队(enQueue)
  • 队头:只能从队头移除元素,叫做出队(deQueue)
  • 先进先出元素,First In First Out(FIFO)

接口设计

根据队列的定义设计接口如下表:

函数 释义
int size() 元素数量
boolean isEmpty() 是否为空
void clear() 清空
void enQueue(E element) 入队
E dequeue() 出队
E front() 获取队列的头元素
  • E 是泛型类型

实现

看队列,需要操作它的头部和尾部,所以从探究过的动态数组链表 中选择时,可以优先选择双向链表

public class Queue<E> {
   
     

	private List<E> list = new LinkList<>();
	/**
	 * 元素数量
	 * @return
	 */
	int size() {
   
     
		return list.size();
	}
	/**
	 * 是否为空
	 * @return
	 */
	boolean isEmpty() {
   
     
		return list.isEmpty();
	}
	
	/**
	 * 清空
	 */
	void clear() {
   
     
		list.clear();
	}
	
	/**
	 * 入队
	 * @param element
	 */
	void enQueue(E element) {
   
     
		list.add(element);
	}
	/**
	 * 出队
	 * @return
	 */
	E deQueue() {
   
     
		return list.remove(0);
	}
	/**
	 * 获取队头元素
	 * @return
	 */
	E front() {
   
     
		return list.get(0);
	}
}

双端队列(Deque)

双端队列是可以在队列的两头都可以操作入队和出队。所以增加了相关的接口

函数 释义
void enQueueRear(E element) 从队尾入队
E deQueueFront() 从队头出队
void enQueueFront(E element) 从队头出队
E deQueueRear() 从队尾出队
E front() 获取队列的头元素
E rear() 获取队列的尾元素

实现

public class Deque<E> {
   
     
	private LinkList<E> list = new LinkList<>();
	
	/**
	 * 元素数量
	 * @return
	 */
	int size() {
   
     
		return list.size();
	}
	/**
	 * 是否为空
	 * @return
	 */
	boolean isEmpty() {
   
     
		return list.isEmpty();
	}
	/**
	 * 清空
	 */
	void clear() {
   
     
		list.clear();
	}
	/**
	 * 从队头入队
	 * @param element
	 */
	void enQueueFront(E element) {
   
     
		list.add(0, element);
	}
	/**
	 * 从队尾入队
	 * @param element
	 */
	void enQueueRear(E element) {
   
     
		list.add(element);
	}
	/**
	 * 从队头出队
	 */
	E deQueueFront() {
   
     
		return list.remove(0);
	}
	/**
	 * 从队尾出队
	 */
	E deQueueRear() {
   
     
		return list.remove(list.size() - 1);
	}
	/**
	 * 获取队列的头元素
	 * @return
	 */
	E front() {
   
     
		return list.get(0);
	}
	/**
	 * 获取队列的尾元素
	 * @return
	 */
	E rear() {
   
     
		return list.get(list.size() -1);
	}
}