云开的博客原文:https://chenyunxin.cn/posts/3058917998.html
欢迎访问我的博客交流哟😜:https://chenyunxin.cn/
前言
队列(queue)是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。
队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最先从队列中删除,故队列又称为先进先出(FIFO—first in first out)线性表。
入队(push):线性表中,入队数据存储在last+1(last为未入队时栈顶元素的下标)的位置;链式表中,表中的最后一个结点指向待入队结点,待入队结点指向空(NULL);
出队(pop):线性表中,数据依次左移一个单位;链式栈中,head指向它后继节点的后继节点(head->next = head->next->next);
取队列顶(front):线性表中,返回
下标为0
的一个数据;链式表中,返回 head 的后继节点的数据。
队列的操作接口
操作接口 | 功能 |
---|---|
void push(T p) | 将元素p插入队尾(入队) |
void pop() | 删除队首元素 |
bool front(T &p) | 成功得到队列顶元素返回true,并得到队列顶数据p |
bool isEmpty() | 判断队列是否为空 |
int size() | 得到队列的大小 |
线性队列
使用线性结构数组来实现栈的操作。
线性队列的定义
template<class T>
class SeqQueue {
public:
T *data;
int maxSize{
}; //能存储的最大数据量
int last{
}; //当前存储的元素个数(并非元素下标)
public:
SeqQueue(); //构造函数
SeqQueue(SeqQueue<T> &list); //拷贝构造函数
~SeqQueue(); //析构函数
void reSize(); //增加空间大小
void push(T p); //进队列
void pop(); //出队列
bool front(T &p); //取队列顶
bool isEmpty(); //判断栈是否为空
int size(); //返回队列的大小
void print(); //打印队列
void clear(); //清空队列
void delete_link(); //摧毁队列
};
基本函数
//构造函数
template<class T>
SeqQueue<T>::SeqQueue() {
maxSize = 50; //初始最大存储量为50
last = 0;
data = new T[maxSize]; //给数组分配空间
if (data == NULL) //动态分配失败
{
cerr << "存储分配错误!" << endl;
exit(1);
}
}
//拷贝构造函数
template<class T>
SeqQueue<T>::SeqQueue(SeqQueue<T> &list) {
maxSize = list.maxSize;
last = list.last;
data = new T[maxSize];
if (data == NULL) //动态分配失败
{
cerr << "存储分配错误!" << endl;
exit(1);
}
for (int i = 0; i < maxSize; i++)
data