C++ STL 環形隊列模擬實現
下面是一個使用C++ STL實現的環形隊列(Circular Queue)的完整示例:
#include <iostream>
#include <vector>
#include <stdexcept>template <typename T>
class CircularQueue {
private:std::vector<T> data; // 使用vector作為底層存儲size_t front; // 隊頭指針size_t rear; // 隊尾指針size_t currentSize; // 當前隊列中元素數量size_t capacity; // 隊列容量public:// 構造函數,初始化隊列容量explicit CircularQueue(size_t size) : data(size), front(0), rear(0), currentSize(0), capacity(size) {}// 判斷隊列是否為空bool isEmpty() const {return currentSize == 0;}// 判斷隊列是否已滿bool isFull() const {return currentSize == capacity;}// 獲取隊列當前元素數量size_t size() const {return currentSize;}// 入隊操作void enqueue(const T& item) {if (isFull()) {throw std::overflow_error("Queue is full");}data[rear] = item;rear = (rear + 1) % capacity;++currentSize;}// 出隊操作T dequeue() {if (isEmpty()) {throw std::underflow_error("Queue is empty");}T item = data[front];front = (front + 1) % capacity;--currentSize;return item;}// 查看隊首元素T peek() const {if (isEmpty()) {throw std::underflow_error("Queue is empty");}return data[front];}// 打印隊列內容(用于調試)void print() const {if (isEmpty()) {std::cout << "Queue is empty" << std::endl;return;}std::cout << "Queue contents: ";size_t i = front;for (size_t count = 0; count < currentSize; ++count) {std::cout << data[i] << " ";i = (i + 1) % capacity;}std::cout << std::endl;}
};int main() {// 創建一個容量為5的環形隊列CircularQueue<int> queue(5);// 測試入隊操作queue.enqueue(10);queue.enqueue(20);queue.enqueue(30);queue.enqueue(40);queue.enqueue(50);queue.print(); // 輸出: 10 20 30 40 50// 測試隊列已滿try {queue.enqueue(60);} catch (const std::overflow_error& e) {std::cout << "Error: " << e.what() << std::endl;}// 測試出隊操作std::cout << "Dequeued: " << queue.dequeue() << std::endl; // 輸出: 10std::cout << "Dequeued: " << queue.dequeue() << std::endl; // 輸出: 20queue.print(); // 輸出: 30 40 50// 測試環形特性queue.enqueue(60);queue.enqueue(70);queue.print(); // 輸出: 30 40 50 60 70// 測試查看隊首元素std::cout << "Front element: " << queue.peek() << std::endl; // 輸出: 30// 測試隊列空的情況while (!queue.isEmpty()) {queue.dequeue();}try {queue.dequeue();} catch (const std::underflow_error& e) {std::cout << "Error: " << e.what() << std::endl;}return 0;
}
實現說明
-
底層存儲:使用
std::vector
作為底層容器存儲隊列元素。 -
關鍵指針:
front
:指向隊列第一個元素rear
:指向隊列下一個插入位置currentSize
:記錄當前隊列中元素數量capacity
:隊列的總容量
-
環形特性:通過模運算實現指針的循環移動:
rear = (rear + 1) % capacity; front = (front + 1) % capacity;
-
主要操作:
enqueue()
:向隊尾添加元素dequeue()
:從隊首移除元素peek()
:查看隊首元素但不移除isEmpty()
/isFull()
:檢查隊列狀態
-
異常處理:當隊列滿時入隊或隊列空時出隊會拋出相應異常。
這個實現充分利用了STL的vector容器,同時通過模運算實現了環形隊列的特性,避免了普通隊列在出隊后空間無法再利用的問題。