欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

队列 Queue First In First Out FIFO

时间:2024-06-21 11:09 作者:admin 点击:
队列(Queue)是一种遵循先进先出(First In First Out,FIFO)原则的线性数据结构。在队列中,元素的添加总是在一端进行,称为队尾(Rear),而元素的移除总是在另一端进行,称为队首(

队列(Queue)是一种遵循先进先出(First In First Out,FIFO)原则的线性数据结构。在队列中,元素的添加总是在一端进行,称为队尾(Rear),而元素的移除总是在另一端进行,称为队首(Front)。

队列的基本操作:

  1. Enqueue:在队尾添加一个元素。
  2. Dequeue:移除队首的元素,并返回它。
  3. Peek/Front:查看队首的元素,但不移除它。
  4. IsEmpty:检查队列是否为空。
  5. IsFull:检查队列是否已满(对于固定大小的队列)。
  6. Size:获取队列中元素的数量。

队列的实现方式:

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

数组实现:

使用数组实现队列时,需要两个指针,一个指向队首,一个指向队尾。当到达数组末尾时,需要回绕到数组开始位置。

#include <iostream>
#include <vector>

class Queue {
private:
    std::vector<int> elements;
    int frontIndex;
    int rearIndex;
    bool isFull;

public:
    Queue(int size) : frontIndex(0), rearIndex(0), isFull(false) {
        elements.resize(size);
    }

    void enqueue(int element) {
        if (isFull) {
            throw std::overflow_error("Queue is full");
        }
        elements[rearIndex] = element;
        rearIndex = (rearIndex + 1) % elements.size();
        isFull = rearIndex == frontIndex;
    }

    int dequeue() {
        if (isEmpty()) {
            throw std::underflow_error("Queue is empty");
        }
        int element = elements[frontIndex];
        frontIndex = (frontIndex + 1) % elements.size();
        isFull = false;
        return element;
    }

    int peek() {
        if (isEmpty()) {
            throw std::underflow_error("Queue is empty");
        }
        return elements[frontIndex];
    }

    bool isEmpty() {
        return (!isFull && rearIndex == frontIndex);
    }

    bool isFull() {
        return isFull;
    }

    size_t size() {
        return isFull ? elements.size() : (rearIndex - frontIndex + elements.size()) % elements.size();
    }
};

链表实现:

使用链表实现队列时,不需要担心数组的固定大小问题。链表的头节点对应队首,尾节点对应队尾。

#include <iostream>
#include <memory>

class Node {
public:
    int data;
    std::unique_ptr<Node> next;

    Node(int data) : data(data), next(nullptr) {}
};

class Queue {
private:
    std::unique_ptr<Node> head; // 队首节点
    std::unique_ptr<Node> rear; // 队尾节点

public:
    Queue() : head(nullptr), rear(nullptr) {}

    void enqueue(int element) {
        auto newNode = std::make_unique<Node>(element);
        if (!head) {
            head = std::move(newNode);
            rear = head.get();
        } else {
            rear->next = std::move(newNode);
            rear = rear->next.get();
        }
    }

    int dequeue() {
        if (isEmpty()) {
            throw std::underflow_error("Queue is empty");
        }
        int element = head->data;
        auto oldHead = std::move(head);
        head = std::move(oldHead->next);
        if (head == nullptr) {
            rear = nullptr;
        }
        return element;
    }

    int peek() {
        if (isEmpty()) {
            throw std::underflow_error("Queue is empty");
        }
        return head->data;
    }

    bool isEmpty() {
        return head == nullptr;
    }

    size_t size() {
        size_t count = 0;
        auto current = head.get();
        while (current != nullptr) {
            count++;
            current = current->next.get();
        }
        return count;
    }
};

队列的应用场景:

  1. 任务调度:在操作系统中,进程和线程调度使用队列来管理任务队列。
  2. 缓冲处理:如打印机任务队列,按照先进先出的顺序处理打印请求。
  3. 广度优先搜索:在图算法中,广度优先搜索使用队列来遍历节点。
  4. 实时处理系统:如网络请求处理,按照接收顺序响应请求。
  5. 生产者-消费者问题:生产者将产品放入队列,消费者从队列中取出产品。

队列是一种基础的数据结构,广泛应用于需要按顺序处理元素的场景。通过提供先进先出的操作,队列可以有效地管理数据流和任务队列。


(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%