【数据结构】队列

举报
幼儿园老大* 发表于 2024/10/29 21:12:16 2024/10/29
【摘要】 一、队列的定义队列(Queue)是一种特殊的线性数据结构,它遵循先进先出(First In First Out,FIFO)的原则。就像排队买票一样,先来的人先得到服务,后来的人排在后面等待。二、队列的基本操作入队(Enqueue):将一个元素添加到队列的末尾。这个操作的时间复杂度通常为 O (1)。出队(Dequeue):从队列的头部移除一个元素,并返回该元素。这个操作的时间复杂度也为 O ...
一、队列的定义


队列(Queue)是一种特殊的线性数据结构,它遵循先进先出(First In First Out,FIFO)的原则。就像排队买票一样,先来的人先得到服务,后来的人排在后面等待。


二、队列的基本操作


  1. 入队(Enqueue):将一个元素添加到队列的末尾。这个操作的时间复杂度通常为 O (1)。
  2. 出队(Dequeue):从队列的头部移除一个元素,并返回该元素。这个操作的时间复杂度也为 O (1)。
  3. 查看队首元素(Peek/Front):返回队列头部的元素,但不删除它。同样时间复杂度为 O (1)。
  4. 判断队列是否为空(IsEmpty):检查队列中是否没有任何元素。时间复杂度为 O (1)。


三、队列的存储方式


队列可以用数组或链表来实现。


  1. 数组实现
    • 可以定义一个固定大小的数组来存储队列中的元素。需要两个变量来分别记录队首和队尾的位置。
    • 入队操作就是将元素放入数组中当前队尾位置,并更新队尾指针。
    • 出队操作则是取出队首元素,并将队首指针加一。
    • 当队首或队尾指针到达数组末尾时,需要进行循环处理,以实现队列的循环使用。
    • 优点是实现简单,访问元素速度快。缺点是如果定义的数组大小不够大,可能会出现队列溢出;如果定义的数组过大,又会浪费空间。
  2. 链表实现
    • 每个节点包含一个数据元素和一个指向下一个节点的指针。队首和队尾分别指向链表的第一个和最后一个节点。
    • 入队操作就是在链表尾部添加一个新节点。
    • 出队操作就是删除链表头部的节点。
    • 优点是可以动态地调整队列的大小,不会出现队列溢出的情况。缺点是需要额外的空间来存储指针,访问元素的速度相对较慢。


四、队列的应用场景


  1. 任务调度:在操作系统中,用于管理任务的执行顺序。新的任务被加入到队列中,等待被调度执行。
  2. 消息队列:在分布式系统中,用于在不同的组件之间传递消息。发送者将消息放入队列中,接收者从队列中取出消息进行处理。
  3. 广度优先搜索:在图的遍历算法中,队列可以用来实现广度优先搜索。每次访问一个节点时,将该节点的所有邻接节点加入队列中,然后从队列中取出一个节点继续访问。
  4. 缓存管理:在计算机系统中,用于管理缓存数据。当缓存已满时,可以使用队列来决定哪些数据应该被替换出去。


五、代码实现


以下是用 Java 语言实现队列的代码示例:
class Queue<T> {
    private int front;
    private int rear;
    private T[] queue;
    private int capacity;

    @SuppressWarnings("unchecked")
    public Queue(int capacity) {
        this.capacity = capacity;
        queue = (T[]) new Object[capacity];
        front = rear = -1;
    }

    public boolean isEmpty() {
        return front == -1;
    }

    public boolean isFull() {
        return (rear + 1) % capacity == front;
    }

    public void enqueue(T item) {
        if (isFull()) {
            throw new RuntimeException("Queue is full");
        }
        if (isEmpty()) {
            front = rear = 0;
        } else {
            rear = (rear + 1) % capacity;
        }
        queue[rear] = item;
    }

    public T dequeue() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is empty");
        }
        T item = queue[front];
        if (front == rear) {
            front = rear = -1;
        } else {
            front = (front + 1) % capacity;
        }
        return item;
    }

    public T peek() {
        if (isEmpty()) {
            throw new RuntimeException("Queue is empty");
        }
        return queue[front];
    }
}

public class QueueExample {
    public static void main(String[] args) {
        Queue<Integer> queue = new Queue<>(5);
        queue.enqueue(1);
        queue.enqueue(2);
        queue.enqueue(3);
        System.out.println("队首元素:" + queue.peek());
        System.out.println("出队元素:" + queue.dequeue());
        System.out.println("队首元素:" + queue.peek());
        System.out.println("队列是否为空:" + queue.isEmpty());
    }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。