环形队列的判空和判满是一个比较基础的问题,可以通过以下两种方法来实现,
- 使用一个专门的变量来记录环形队列中的元素个数,当元素数量为0时,队列为空,当元素数量为队列的大小时,队列为满。
- 将尾节点前面一个空间留出来,不放置元素,当头节点快要追上尾节点的时候,用来判满。
定义环形队列抽象类
#define MAX_SIZE 1024
class CircularQueue {
protected:
int head;
int tail;
int* data;
int size;
public:
CircularQueue(int size);
int getSize();
virtual bool enqueue(int val) = 0;
virtual bool dequeue(int *ptr) = 0;
virtual bool empty() = 0;
virtual bool full() = 0;
~CircularQueue();
};
CircularQueue::CircularQueue(int size) {
if (size <= 0 || size > MAX_SIZE) {
this->data = NULL;
return ;
}
this->data = new int[size];
this->size = size;
this->head = 0;
this->tail = 0;
}
CircularQueue::~CircularQueue() {
if (this->data) {
delete []this->data;
}
}
int CircularQueue::getSize() {
return this->size;
}
方法一:
class Queue1 : public CircularQueue {
private:
int cap;
public:
Queue1(int size) : CircularQueue(size) {
this->cap = 0;
}
bool enqueue(int val);
bool dequeue(int *ptr);
bool empty();
bool full();
};
bool Queue1::empty() {
return this->cap == 0;
}
bool Queue1::full() {
return this->cap == this->size;
}
bool Queue1::enqueue(int val) {
if (this->full()) {
return false;
}
this->data[this->head] = val;
this->head = (this->head + 1) % this->size;
this->cap++;
return true;
}
bool Queue1::dequeue(int* ptr) {
if (ptr == NULL || this->empty()) {
return false;
}
*ptr = this->data[this->tail];
this->tail = (this->tail + 1) % this->size;
this->cap--;
return true;
}
方法二:
class Queue2 : public CircularQueue{
public:
Queue2(int size) : CircularQueue(size) {}
bool enqueue(int val);
bool dequeue(int *ptr);
bool empty();
bool full();
};
bool Queue2::empty() {
return this->tail == this->head;
}
bool Queue2::full() {
return (this->head + 1) % this->size == this->tail;
}
bool Queue2::enqueue(int val) {
if (this->full()) {
return false;
}
this->data[this->head] = val;
this->head = (this->head + 1) % this->size;
return true;
}
bool Queue2::dequeue(int* ptr) {
if (ptr == NULL || this->empty()) {
return false;
}
*ptr = this->data[this->tail];
this->tail = (this->tail + 1) % this->size;
return true;
}
测试代码:
#include <iostream>
using namespace std;
void test() {
Queue1 q(3);
int ret = q.enqueue(1);
cout << "enqueue result: " << ret << endl;
ret = q.enqueue(2);
cout << "enqueue result: " << ret << endl;
ret = q.enqueue(3);
cout << "enqueue result: " << ret << endl;
int tmp = 0;
ret = q.dequeue(&tmp);
cout << "dequeue result: " << ret << endl;
ret = q.enqueue(4);
cout << "enqueue result: " << ret << endl;
cout << endl;
}
void test2() {
Queue2 q(3);
int ret = q.enqueue(1);
cout << "enqueue result: " << ret << endl;
ret = q.enqueue(2);
cout << "enqueue result: " << ret << endl;
ret = q.enqueue(3);
cout << "enqueue result: " << ret << endl;
int tmp = 0;
ret = q.dequeue(&tmp);
cout << "dequeue result: " << ret << endl;
ret = q.enqueue(4);
cout << "enqueue result: " << ret << endl;
cout << endl;
}
int main(void) {
test();
test2();
return 0;
}
输出结果:
enqueue result: 1
enqueue result: 1
enqueue result: 1
dequeue result: 1
enqueue result: 1
enqueue result: 1
enqueue result: 1
enqueue result: 0
dequeue result: 1
enqueue result: 1