返回

队列结构与算法深度剖析

见解分享

引言

数据结构是计算机科学的基础,而队列作为一种重要的线性数据结构,在众多领域发挥着至关重要的作用。本文将深入探索队列的结构、相关算法,以及如何在代码中实现队列。

队列结构

队列是一种遵循先进先出(FIFO)原则的存储结构。队列的尾部称为队尾,头部称为队头。当元素插入队列时,它们添加到队尾;当元素从队列中删除时,它们从队头删除。

循环队列

循环队列是一种常见的队列实现方式,它使用一个固定大小的数组来存储元素。循环队列有两个指针:队头指针和队尾指针。队头指针指向队列中的第一个元素,队尾指针指向下一个可用于插入元素的位置。

算法

入队

入队算法将元素添加到队列的队尾:

  1. 检查队列是否已满(队尾指针等于队头指针)。
  2. 如果队列已满,则返回错误。
  3. 否则,将元素插入队尾(队尾指针指向的新位置),并更新队尾指针。

出队

出队算法从队列的队头删除元素:

  1. 检查队列是否为空(队尾指针等于队头指针)。
  2. 如果队列为空,则返回错误。
  3. 否则,从队头(队头指针指向的位置)删除元素,并更新队头指针。

队列的判断

队列为空

  • 如果队尾指针等于队头指针,则队列为空。

队列已满

  • 如果队尾指针指向数组的最后一个位置,并且队头指针不指向数组的第一个位置,则队列已满。

代码实现

循环队列的 C++ 代码

class CircularQueue {
    int *arr;
    int size;
    int head, tail;

public:
    CircularQueue(int n) {
        size = n;
        arr = new int[size];
        head = tail = -1;
    }

    void enqueue(int data) {
        if (isFull()) return;
        if (isEmpty()) head = tail = 0;
        tail = (tail + 1) % size;
        arr[tail] = data;
    }

    int dequeue() {
        if (isEmpty()) return -1;
        int data = arr[head];
        if (head == tail) head = tail = -1;
        else head = (head + 1) % size;
        return data;
    }

    bool isEmpty() { return head == -1; }
    bool isFull() { return (tail + 1) % size == head; }
};