队列是一种特殊的线性群体,可以用数组或者链表来存储队列中的元素
队列中元素访问是受到限制的,只能在队尾删除元素(出队),在队头添加元素(入队)
队列有3种基本状态:一般状态、队空、队满。当队中没有元素时称为队空;当队中元素个数达到上限时,称为队满;当队中有元素,但未达到队满状态时,即处于一般状态
如果用静态数组存储队列元素,则元素个数达到数组声明的元素个数时即为队满。如果使用动态数组或者链表,则可以根据需要设置或不设置元素的最大个数
队列类的数据成员应该包括:队列元素、队头指针和队尾指针。队列类的函数成员应该包括:初始化、入队、出队、清空队列、访问队首元素和检测队列状态
为了有效的利用队列的空间,提高队列的效率,可以将队列设计成循环队列。元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便回到数组开头(采用取余运算)
#include <cassert>
template <class T, int SIZE = 50>
class Queue {
private:
int front, rear, count; //队头指针,队尾指针,元素个数
T list[SIZE]; //队列元素数组
public:
Queue(); //构造函数,初始化队头指针,队尾指针,元素个数
void insert(const T& item); //新元素入队
T remove(); //元素出队
void clear(); //清空队列
const T& getFront()const; //访问队首元素
//测试队列状态
int getLength()const; //求队列长度(元素个数)
bool isEmpty()const; //判断队列是否为空
bool isFull()const; //判断队列是否为满
};
template<class T, int SIZE>
Queue<T, SIZE>::Queue()
:front(0),rear(0),count(0)
{
}
template<class T, int SIZE>
void Queue<T, SIZE>::insert(const T& item) //向队尾插入元素
{
assert(count != SIZE); //判断元素个数是否达到限制
count++; //元素个数加1
list[rear] = item; //向队尾插入元素
rear = (rear + 1) % SIZE; //队尾指针增1,用取余运算实现循环队列
}
template<class T, int SIZE>
T Queue<T, SIZE>::remove() //删除队首元素,并返回该元素的值(出队)
{
assert(count != 0); //判断元素个数是否达到限制
int temp = front; //记录原先的队首指针
count--; //元素个数减1
front = (front + 1) % SIZE; //队首指针增1,取余以实现循环队列
return list[temp]; //返回首元素的值
}
template<class T, int SIZE>
void Queue<T, SIZE>::clear() //清空队列
{
count = 0;
front = 0;
rear = 0;
}
template<class T, int SIZE>
const T& Queue<T, SIZE>::getFront() const //返回队列首元素的值
{
return list[front];
}
template<class T, int SIZE>
int Queue<T, SIZE>::getLength() const //返回队列元素个数
{
return count;
}
template<class T, int SIZE>
bool Queue<T, SIZE>::isEmpty() const //判断队列是否为空
{
return count == 0;
}
template<class T, int SIZE>
bool Queue<T, SIZE>::isFull() const //判断队列是否为假
{
return count == SIZE;
}