# 队列 | 如何使用数组和链表来实现“队列”

### 数组实现

#### 代码实现

```/**
* 数组实现队列
*
* @author tian
* @date 2020/4/26
*/
public class MyArrayQueueDemo {
public static void main(String[] args) {
MyQueueDemo<Integer> myQueueDemo = new MyQueueDemo<>();

myQueueDemo.enQueue(1);
System.out.println("-----向队列中添加元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.enQueue(2);
System.out.println("-----向队列中添加元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.enQueue(3);
System.out.println("-----向队列中添加元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.enQueue(4);
System.out.println("-----向队列中添加元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());

System.out.println("---------------------------");
myQueueDemo.deQueue();
System.out.println("-----从队列中取出元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.deQueue();
System.out.println("-----从队列中取出元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.deQueue();
System.out.println("-----从队列中取出元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
myQueueDemo.deQueue();
System.out.println("-----从队列中取出元素-----");
System.out.println("队列头元素 = " + myQueueDemo.getFront());
System.out.println("队列尾元素 = " + myQueueDemo.getBack());
System.out.println("队列大小 = " + myQueueDemo.size());
}
}

class MyQueueDemo<T> {
private List<T> arrayList = new ArrayList<>();

private int front;
private int rear;

public MyQueueDemo() {
this.front = 0;
this.rear = 0;
}

public boolean isEmpty() {
return front == rear;
}

public int size() {
return rear - front;
}

//获取对手元素
public T getFront() {
if (isEmpty()) {
return null;
}
return arrayList.get(front);
}

//获取队列尾部元素
public T getBack() {
if (isEmpty()) {
return null;
}
return arrayList.get(rear - 1);
}

//删除队列中头部元素
public void deQueue() {
if (rear > front) {
front++;
} else {
System.out.println("队列已经不存在元素了");
}
}

//把新元素添加到队列中（队列尾部）
public void enQueue(T item) {
rear++;
}
}```

OK，自此，使用数组实现队列已经搞定。

### 链表实现

#### 代码实现

```/**
* @author tian
* @date 2020/4/26
*/
class QueueNode<T> {
T data;
QueueNode<T> next;

}

class MyNodeQueue<T> {
private QueueNode<T> end;
//初始化队列
public MyNodeQueue() {
}

boolean isEmpty() {
}

int size() {
int size = 0;
while (temp != null) {
temp = temp.next;
size++;
}
return size;
}
//入队
void enQueue(T t) {
QueueNode<T> temp = new QueueNode<>();
temp.data = t;
temp.next = null;
} else {
end.next = temp;
end = temp;
}
}
//出队
void deQueue() {
System.out.println("不存在元素，出队失败");
return;
}
end = null;
}
}
//获取队首元素
T getFront() {
System.out.println("队列中不存在元素，获取为空");
return null;
}
}
//获取队尾元素    T getBack() {        if (end == null) {
System.out.println("队列中不存在元素，获取失败");
return null;
}
return end.data;
}
}

public class MyNodeQueueDemo {
public static void main(String[] args) {
MyNodeQueue<Integer> queue = new MyNodeQueue<>();
queue.enQueue(1);
System.out.println("向队列中添加元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.enQueue(2);
System.out.println("向队列中添加元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.enQueue(3);
System.out.println("向队列中添加元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.enQueue(4);
System.out.println("向队列中添加元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());

System.out.println("------------------");

queue.deQueue();
System.out.println("从队列中取出元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.deQueue();
System.out.println("从队列中取出元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.deQueue();
System.out.println("从队列中取出元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
queue.deQueue();
System.out.println("从队列中取出元素");
System.out.println("头 元素=" + queue.getFront());
System.out.println("尾 元素=" + queue.getBack());
System.out.println("大小=" + queue.size());
}
}```

OK，使用链表实现队列到此就搞定。

0 条评论

• ### 栈 | 如何使用数组和链表实现“栈”

实现一个栈的数据结构，使其具有以下方法：压栈、弹栈、取栈顶元素、判断栈是否为空以及获取栈中元素个数。下面是一个栈的入栈和出栈整个过程

• ### 快速掌握并发编程---ArrayBlockingQueue 底层原理和实战

在JDK1.5的时候，在新增的Concurrent包中，BlockingQueue很好的解决了多线程中，如何高效安全“传输”数据的问题。通过这些高效并且线程安全...

• ### 【原创】Spring Boot 如何手写stater

很多人可能会觉得这种starter方式很牛B，添加一个starter就搞定了很多事情。今天咱们也来搞一个自己的starter。

• ### java之集合那些事

1、Hash Set和 TreeSet是Set的两个典型实现，到底如何选择 Hash Set和 Tree Set呢？ HashSet的性能总是比 TreeSet...

• ### 测试性能(Java 8 的循环和Java 7 的循环耗时的对比测试)

说高级的stream就是那个并行流。下面是那个并行流的简单实现。只要是继承Collection类的都可以这么用。

• ### 算法03 七大排序之：直接插入排序和希尔排序

上一篇总结了直接选择排序和堆排序，这一篇要总结的是插入排序中的直接插入排序和希尔排序，我们主要从以下几点进行总结。 1、直接插入排序及算法实现 2、希尔排序及算...

• ### Selenium Webdriver 3.X源码分析之ActionChains

> Selenium Webdriver 3.X源码分析系列第5篇，该系列原则上会将整个源码分享一遍

• ### getBoundingClientRect方法获取元素在页面中的相对位置

获取元素位置可以用 offset 或 getBoundingClientRect，使用 offset 因为兼容性不好，比较麻烦，offset获取位置会形成“回溯...

• ### java之==操作符和equals操作符

说明：a1和b1指向的是同一个String，而a2和b2指向不同的String，所以a2.equals(b2)只比较值返回true，==比较引用返回false。

• ### 遍历目录清理COS中大小为0的文件 for JAVA

在上传到COS文件中，会存在一些0字节的文件，对于部分业务来说是无效的。需要做清理，否则看着碍眼也没用。