循環隊列是一種特殊的隊列數據結構,它具有固定大小的緩沖區,并且在尾部插入元素時會循環回到緩沖區的起始位置。在C++中,可以通過自定義一個循環隊列類來實現這種數據結構,同時為了支持迭代器訪問循環隊列中的元素,需要設計相應的迭代器類。
以下是一個簡單的循環隊列類及其迭代器類的設計示例:
#include <iostream>
#include <vector>
template <typename T>
class CircularQueue {
public:
CircularQueue(int size) : size_(size), front_(0), rear_(0), count_(0) {
buffer_.resize(size_);
}
void push(const T& value) {
if (isFull()) {
std::cerr << "Queue is full!" << std::endl;
return;
}
buffer_[rear_] = value;
rear_ = (rear_ + 1) % size_;
count_++;
}
T pop() {
if (isEmpty()) {
std::cerr << "Queue is empty!" << std::endl;
return T();
}
T value = buffer_[front_];
front_ = (front_ + 1) % size_;
count_--;
return value;
}
bool isEmpty() {
return count_ == 0;
}
bool isFull() {
return count_ == size_;
}
class Iterator {
public:
Iterator(CircularQueue& queue, int index) : queue_(queue), index_(index) {}
T& operator*() {
return queue_.buffer_[index_];
}
Iterator& operator++() {
index_ = (index_ + 1) % queue_.size_;
return *this;
}
bool operator!=(const Iterator& other) const {
return index_ != other.index_;
}
private:
CircularQueue& queue_;
int index_;
};
Iterator begin() {
return Iterator(*this, front_);
}
Iterator end() {
return Iterator(*this, rear_);
}
private:
std::vector<T> buffer_;
int size_;
int front_;
int rear_;
int count_;
};
int main() {
CircularQueue<int> queue(5);
queue.push(1);
queue.push(2);
queue.push(3);
for (auto it = queue.begin(); it != queue.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
queue.pop();
for (auto it = queue.begin(); it != queue.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
在上面的示例中,CircularQueue類表示一個循環隊列,包括push、pop、isEmpty等方法用于操作隊列。迭代器類Iterator用于遍歷隊列中的元素,重載了*、++和!=操作符。通過begin和end方法返回隊列的起始和結束迭代器,可以使用標準庫的循環語句對隊列進行遍歷。
這種設計模式可以使循環隊列的迭代器更加靈活和易于使用,方便對隊列中的元素進行訪問和操作。