队列是一种先进先出(FIFO)的数据结构,类似于现实中排队等待的场景。队列有两个基本操作:入队(enqueue)和出队(dequeue)。新元素被插入到队列的尾部,并且只有队列头部的元素才能被移除。
在Java中,可以使用LinkedList或ArrayDeque来实现队列。LinkedList是一个双向链表,在队列的头部和尾部添加元素非常快。而ArrayDeque是一个循环数组,对于较大的队列效率更高。
以下是使用Java代码创建队列的示例:
import java.util.LinkedList;
import java.util.Queue;
public class QueueExample {
public static void main(String[] args) {
Queue<String> queue = new LinkedList<>();
// 入队
queue.add("Alice");
queue.add("Bob");
queue.add("Charlie");
// 出队
String firstPerson = queue.remove();
System.out.println("The first person in the queue is " + firstPerson);
// 查看队头元素
String head = queue.peek();
System.out.println("The head of the queue is " + head);
}
}
在这个示例中,我们使用了Java内置的Queue接口和LinkedList实现队列。我们首先添加了三个元素到队列中,然后从队列中删除第一个元素并打印它,最后查看队列的头部元素并打印。输出如下:
The first person in the queue is Alice
The head of the queue is Bob
一个使用队列的示例是广度优先搜索(BFS)算法。BFS是一种用于遍历或搜索图的算法,它从图的一个起始节点开始,逐层遍历其邻居节点,直到找到目标节点为止。
以下是使用Java代码实现BFS算法的示例:
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
public class BFSExample {
public static void main(String[] args) {
// 构建无向图
int n = 6;
List<Integer>[] graph = new List[n];
for (int i = 0; i < n; i++) {
graph[i] = new ArrayList<>();
}
graph[0].add(1);
graph[0].add(2);
graph[1].add(3);
graph[1].add(4);
graph[2].add(4);
graph[3].add(5);
graph[4].add(5);
// BFS
boolean[] visited = new boolean[n];
Queue<Integer> queue = new ArrayDeque<>();
queue.add(0);
visited[0] = true;
while (!queue.isEmpty()) {
int node = queue.remove();
System.out.println("Visiting node " + node);
for (int neighbor : graph[node]) {
if (!visited[neighbor]) {
queue.add(neighbor);
visited[neighbor] = true;
}
}
}
}
}
在这个示例中,我们首先构建了一个无向图,并使用BFS算法从节点0开始遍历整个图。我们使用了Java内置的Queue接口和ArrayDeque实现队列,逐层遍历邻居节点,并将其添加到队列中。在遍历每个节点时,我们打印出正在访问的节点编号。输出如下:
Visiting node 0
Visiting node 1
Visiting node 2
Visiting node 3
Visiting node 4
Visiting node 5