📜  门|门 IT 2006 |第 38 题(1)

📅  最后修改于: 2023-12-03 15:12:46.446000             🧑  作者: Mango

门|门 IT 2006 |第 38 题

题目描述

本题需要实现一个 Queue 类,支持以下操作:

  • Queue(): 构造函数,初始化队列;
  • void push(int x): 将整数 x 推入队列尾部;
  • void pop(): 从队列头部弹出一个元素;
  • int peek(): 返回队列头部的元素;
  • bool empty(): 返回队列是否为空。

所有操作时间复杂度均为 O(1)。

解题思路

可以使用一个数组和两个指针 head 和 tail 来实现。

  • push:将元素插入队列尾部,tail 构成循环结构,即 tail %= capacity;
  • pop:弹出队列头部元素,head 构成循环结构,即 head %= capacity;
  • peek:返回队列头部元素;
  • empty:判断队列是否为空。
代码实现
class Queue {
    private int capacity;
    private int[] data;
    private int head, tail;

    public Queue(int capacity) {
        this.capacity = capacity + 1;
        this.data = new int[this.capacity];
        this.head = 0;
        this.tail = 0;
    }

    public void push(int x) {
        if (this.isFull())
            return;
        this.data[tail] = x;
        this.tail = (this.tail + 1) % this.capacity;
    }

    public void pop() {
        if (this.isEmpty())
            return;
        this.head = (this.head + 1) % this.capacity;
    }

    public int peek() {
        if (this.isEmpty())
            return -1;
        return this.data[head];
    }

    public boolean empty() {
        return this.head == this.tail;
    }

    private boolean isFull() {
        return (this.tail + 1) % this.capacity == this.head;
    }
}
性能分析

该队列的空间复杂度为 O(N),其中 N 为队列的容量。

注意到该队列的容量实际上是比用户输入的容量加 1 后得到的,这是为了避免在队列满的时候无法插入元素。

由于队列操作的复杂度均为 O(1),所以该队列的时间复杂度为 O(1)。

因此,该队列可以在时间和空间两方面都有比较好的表现。

参考资料