LeetCode(力扣)入门笔记 - 简单队列实现

239 阅读2分钟

LeetCode 入门

2021年12月27日10:36:27

时间安排

学习: 数据结构。如果你是零基础,希望你能够逼一下自己,3 周内刷完这些卡片,并且相关的数据结构知识通过看书来补充完整。如果学过数据结构,最多不要超过 2 周时间。【必刷】

学习: 算法入门。2 周左右完成。【必刷】

学习: 巩固训练。2 到 3 周时间完成。

队列 & 栈

队列:先进先出、栈:后入先出

队列:先入先出的数据结构

FIFO(First Input First Output)数据结构中,将首先处理添加到队列的第一个元素。

如图:

image

队列是典型的 FIFO 数据结构。插入(input)操作也被成为入队(enqueue),新元素始终被添加在队列的末尾。删除(delete)操作也被称为出队(dequeue)。你只能移除第一个元素。

LeetCode动态图演示:

image

队列 - 实现

我们可以利用 动态数组指向队列头部的索引 来实现队列

由队列 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 是在查询上更有效率的,所以还有改善的空间。