1.队列简介
队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。(百度百科)
2.队列的种类
- 顺序队列
基于顺序表实现的队列,由于限定了顺序表的操作,本博文展示的顺序队列是顺序表的私有继承。顺序表相关内容请参见:《数据结构》期末提纲之顺序表 - 链式队列
基链表实现的队列,由于限定了链表的操作,本博文展示的链式队列是链表的私有继承。链表相关内容请参见:《数据结构》期末提纲之链表 - 循环队列
循环队列式经过优化了的顺序队列,能在顺序队列的基础上实现储存空间的循环。具体优化方式在每次有关位置的操作时用位置值加上顺序表所能容纳的最大元素个数,再对最大个数取余。由于循环队列与顺序队列相似,本博文中循环队列采用C语言实现。(室友写的)
3.队列的基本操作
- 入队
进行入队操作时,仅需在线性表尾端新增数据即可。注意,循环队列进行入队时,需进行取余操作,如图所示:(灵魂画师)
- 出队
进行出队操作时,仅需删除线性表尾端元素即可。注意,循环队列出队时,需进行取余操作,如图所示:
- 计数
顺序队列和链式队列级数很简单,尾减头即可,而循环队列的计数需要进行取余操作,应当特别注意,如图所示:
4.顺序队列的C++实现
顺序队列类是顺序表类的私有继承,顺序表相关内容本博文不赘述。 传送门
- 类型创建
template<class DataType>
class SeqQueue : private SeqList<DataType> //顺序队列类,为顺序表的私有继承
{
public:
SeqQueue(); //构造
~SeqQueue(); //析构
void push(DataType x); //从队尾添加元素
DataType front(); //访问队头
void pop(); //出队
int size(); //返回大小
void clr(); //清空队列
private:
int front_loc; //队头位置
int tail_loc; //队尾位置
};
- 构造与析构
template<class DataType>
SeqQueue<DataType>::SeqQueue() //初始化首尾位置即可
{
front_loc = tail_loc = 1;
cout << "SeqQueue Constructed!" << endl;
}
template<class DataType> //使首尾相等并且指向最前即可
SeqQueue<DataType>::~SeqQueue()
{
front_loc = tail_loc = 1;
}
- 入队
template<class DataType>
void SeqQueue<DataType>::push(DataType x) //想顺序表插入值后,队尾加一即可
{
this->insert(this->len + 1,x);
tail_loc = this->len + 1;
}
- 访问队首元素
template<class DataType>
DataType SeqQueue<DataType>::front() //此处仅仅作访问功能,不会删除
{
if(tail_loc - front_loc == 0)
throw "Empty Queue!";
return this->get(front_loc);
}
- 出队
template<class DataType>
void SeqQueue<DataType>::pop()
{
front_loc++; //队首位置加一即可
}
- 计数
template<class DataType>
int SeqQueue<DataType>::size()
{
return tail_loc - front_loc; //队尾减队头即可
}
- 清空
template<class DataType