设计一个循环队列QUEUE<T>,用data[0,MaxSize-1]存放队列元素,用front和rear分别作为队头和队尾指针,并用一个标志tag队列可能空(false)或可能满((true),要求设计队列的相关基本运算算法
时间: 2023-05-27 16:02:39 浏览: 172
- 队列的定义:
```
template <typename T>
class Queue {
private:
T* data; // 存储数据的数组
int front; // 队头指针
int rear; // 队尾指针
int MaxSize; // 队列的最大容量
bool tag; // 标志,表示队是否已满
public:
Queue(int size): MaxSize(size), front(0), rear(0), tag(false) {
// 构造函数中初始化队列
data = new T[MaxSize];
}
~Queue() {
// 析构函数中释放存储空间
delete [] data;
}
bool isEmpty() const {
// 判断队是否为空
return (front == rear) && !tag;
}
bool isFull() const {
// 判断队是否已满
return tag;
}
bool enqueue(const T& e) {
// 入队操作
if (isFull()) {
return false;
} else {
data[rear] = e;
rear = (rear + 1) % MaxSize;
if (rear == front) {
tag = true;
}
return true;
}
}
bool dequeue(T& e) {
// 出队操作
if (isEmpty()) {
return false;
} else {
e = data[front];
front = (front + 1) % MaxSize;
tag = false;
return true;
}
}
};
```
上述代码实现了基本的队列操作,其中:
- front 和 rear 分别指向队头和队尾元素,初始值都为0;
- tag 为标志,表示队是否已满,初始值为false;
- enqueue 方法中,如果队列已满,则返回false;否则将元素放入rear指向的位置,并将rear指针向后移动一位,如果此时rear指向了front,则将tag标志设为true;
- dequeue 方法中,如果队列为空,则返回false;否则将队头元素赋值给e,将front指针向后移动一位,将tag标志设为false;
- isEmpty 和 isFull 方法分别判断队是否为空和是否已满,其中判断队是否为空的条件为front == rear && !tag,即front和rear指向同一位置,并且队列不是满的;判断队是否已满的条件为tag为true。
阅读全文