循环队列是一种特殊的队列数据结构,它具有固定大小的缓冲区,并且在尾部插入元素时会循环回到缓冲区的起始位置。在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方法返回队列的起始和结束迭代器,可以使用标准库的循环语句对队列进行遍历。
这种设计模式可以使循环队列的迭代器更加灵活和易于使用,方便对队列中的元素进行访问和操作。