两个细节
- 循环数组的实际size为n+1
- enqueue时tail和head不允许重合(保证元素个数为n),dequeue时可以重合
class Queue
{
int *array;
int head, tail, size;
Queue(Queue &&q) = delete;
Queue(const Queue &q) = delete;
Queue &operator=(const Queue &q) = delete;
public:
Queue(int n)
{
size = n + 1;
array = new int [size];
head = 0;
tail = 0;
}
~Queue()
{
if (array)
{
delete [] array;
array = NULL;
size = -1;
head = -1;
tail = -1;
}
}
bool enqueue(int x)
{
if (full())
return false;
array[tail++] = x;
if (tail >= size)
tail = 0;
return true;
}
bool dequeue(int &res)
{
if (empty())
return false;
res = array[head++];
if (head >= size)
head = 0;
return true;
}
bool empty()
{
return head == tail;
}
bool full()
{
return (tail + 1) % size == head;
}
};