LeetCode 入门
2021年12月27日10:36:27
时间安排
学习: 数据结构。如果你是零基础,希望你能够逼一下自己,3 周内刷完这些卡片,并且相关的数据结构知识通过看书来补充完整。如果学过数据结构,最多不要超过 2 周时间。【必刷】
学习: 算法入门。2 周左右完成。【必刷】
学习: 巩固训练。2 到 3 周时间完成。
队列 & 栈
队列:先进先出、栈:后入先出
队列:先入先出的数据结构
在 FIFO(First Input First Output)数据结构中,将首先处理添加到队列的第一个元素。
如图:
队列是典型的 FIFO 数据结构。插入(input)操作也被成为入队(enqueue),新元素始终被添加在队列的末尾。删除(delete)操作也被称为出队(dequeue)。你只能移除第一个元素。
LeetCode动态图演示:
队列 - 实现
我们可以利用 动态数组 和 指向队列头部的索引 来实现队列
由队列 FIFO 数据结构,以及其基本特性我们可以得出:队列需要支持两种基本操作功能:入队会增加一个新元素,该元素将添加到末尾;删除则会将 当前队列的第一个元素 删除。我们将需要一个新的索引来指向起点。
1、我们创建自己的队列类 MyQueue.java
public class MyQueue<T> {
// 这里利用泛型 来适应多种参数类型
/**
* store element
*/
private List<T> data;
/**
* a pointer to indicate the start position
*/
private final int p_start = 0;
public MyQueue() {
data = new ArrayList<>();
}
}
2、为这个队列添加入队、出队、判空、打印 等通用方法
/**
* inset an element into the queue.Return true if the operation is successful
* 入队,操作成功返回 布尔值 true
*/
public boolean enqueue(T t) {
return data.add(t);
}
/**
* delete an element from the queue.Return first element if the operation is successful
* 出队,操作成功返回 出队的元素
*/
public T dequeue() {
if (isEmpty()) {
return null;
}
T t = data.get(p_start);
if (data.size() > 1) {
data = data.subList(p_start + 1, data.size());
} else {
data = new ArrayList<>();
}
return t;
}
/**
* Get the front item from the queue
* 获取当前队首元素
*/
public T getFront() {
return data.get(p_start);
}
/**
* Checks whether the queue is empty or not
* 检查当前队列是否为空
*/
public boolean isEmpty() {
return data.isEmpty();
}
/**
* Traverse the print queue
* 遍历打印当前队列(队列是利用集合实现(偷懒)直接使用集合toString打印
* 为空则打印 null
*/
public void traverse() {
if (!isEmpty()) {
System.out.println(data.toString());
} else {
System.out.println("null");
}
}
3、最后编写测试类,进行测试
public class QueueTest {
@Test
public void test() {
MyQueue<Integer> queue = new MyQueue<>();
queue.enqueue(1);
queue.enqueue(2);
queue.enqueue(3);
queue.enqueue(4);
queue.enqueue(5);
System.out.println("5个元素入队:");
queue.traverse();
System.out.println("出队一次:");
queue.dequeue();
queue.traverse();
System.out.println("再出队两次:");
queue.dequeue();
queue.dequeue();
queue.traverse();
System.out.println("再出队两次:");
queue.dequeue();
queue.dequeue();
queue.traverse();
}
}
4、打印结果
5个元素入队:
[1, 2, 3, 4, 5]
出队一次:
[2, 3, 4, 5]
再出队两次:
[4, 5]
再出队两次:
null
小总结
根据队列的基本特性实现队列,底层使用的是 数组集合 ArrayList,方便理解。但严格来说,队列数据结构倾向于增删操作,而 ArrayList 是在查询上更有效率的,所以还有改善的空间。