iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
自我挑戰組

C++ AI 起步:編程進入智能世界系列 第 28

佇列演算法:環狀佇列

  • 分享至 

  • xImage
  •  

在佇列的基本型態中,當我們從前端刪除元素時,我們不會重新使用該空間。環狀佇列,或稱為循環佇列(Circular Queue),是一種允許我們重複使用空間的佇列。在環狀佇列中,當最後一位置用完後,下一個插入元素的位置將是佇列的開頭。

環狀佇列的概念
環狀佇列可以被視為一個循環的陣列,其中末尾和開頭是相連接的。當我們試圖在已滿的環狀佇列中進行入佇列操作時,我們將從開頭重新開始,只要開頭前面的位置是空的。

使用陣列實作環狀佇列
以下是環狀佇列的基本結構和操作:

#include <iostream>

#define SIZE 5  // 定義環狀佇列的大小

class CircularQueue {
private:
    int front, rear;
    int arr[SIZE];

public:
    CircularQueue() : front(-1), rear(-1) {}

    bool isFull() {
        return (rear + 1) % SIZE == front;
    }

    bool isEmpty() {
        return front == -1;
    }

    void enqueue(int data) {
        if (isFull()) {
            std::cout << "Queue is full!" << std::endl;
            return;
        }
        if (isEmpty()) {
            front = rear = 0;
        } else {
            rear = (rear + 1) % SIZE;
        }
        arr[rear] = data;
    }

    int dequeue() {
        if (isEmpty()) {
            std::cout << "Queue is empty!" << std::endl;
            return -1;
        }
        int value = arr[front];
        if (front == rear) {
            front = rear = -1;
        } else {
            front = (front + 1) % SIZE;
        }
        return value;
    }

    int peek() {
        if (isEmpty()) {
            std::cout << "Queue is empty!" << std::endl;
            return -1;
        }
        return arr[front];
    }
};

int main() {
    CircularQueue cq;
    cq.enqueue(1);
    cq.enqueue(2);
    cq.enqueue(3);
    cq.enqueue(4);
    cq.enqueue(5);
    std::cout << "Front of the queue: " << cq.peek() << std::endl; // 1
    cq.dequeue();
    cq.enqueue(6);
    std::cout << "Front of the queue: " << cq.peek() << std::endl; // 2
    return 0;
}

總結
環狀佇列提供了一種有效的方法來管理佇列,尤其是當有固定大小的陣列空間時。它允許我們在需要的時候重新使用已刪除的空間,這是常規佇列所不具備的特點。


上一篇
佇列演算法:串列實作佇列
下一篇
佇列演算法:雙向佇列
系列文
C++ AI 起步:編程進入智能世界32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言