队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称链队列。
#include <iostream>
template<typename T>
struct queue_node
{
queue_node(const T& d) : next(nullptr), data(d) {}
queue_node* next;
T data;
};
template<typename T>
class LinkQueue
{
public:
LinkQueue();
~LinkQueue();
void mvPop(); // 出队
void mvPush(const T& d); // 入队
bool mbIsEmpty() { return ((miSize == 0) ? true : false); }
int miGetSize() { return miSize; }
private:
typedef queue_node<T>* queue_type;
private:
queue_type mopFront; // 队头指针
queue_type mopRear; // 队尾指针
int miSize; // 节点数
};
template<typename T>
LinkQueue<T>::LinkQueue() : mopFront(nullptr), mopRear(nullptr), miSize(0)
{
}
template<typename T>
LinkQueue<T>::~LinkQueue()
{
while (mopFront != nullptr) {
queue_type op_del_node = mopFront;
mopFront = mopFront->next;
delete op_del_node;
}
}
template<typename T>
void LinkQueue<T>::mvPop()
{
// 判断是否是空队列
if (mopFront == nullptr) {
std::cout << "Link Queue Is Empty!" << std::endl;
return;
}
// 临时保存将要删除的队头指针
queue_type op_del_node = mopFront;
// 将原对头指针的后继赋值给头指针
mopFront = mopFront->next;
// 出队之后,如果对空则将队尾指针置空
if (mopFront == nullptr) {
mopRear = nullptr;
}
// 删除出队的节点
delete op_del_node;
op_del_node = nullptr;
// 更新节点总数
--miSize;
}
template<typename T>
void LinkQueue<T>::mvPush(const T& d)
{
// 创建新节点
queue_type op_new_node = new queue_node<T>(d);
// 如果队空:对头指针指向新节点
if (mopFront == nullptr) {
mopFront = op_new_node;
mopRear = op_new_node;
}
// 队非空
else {
// 队尾指针的后继指向新节点
mopRear->next = op_new_node;
// 原队尾指针指向新节点
mopRear = op_new_node;
}
// 更新节点总数
++miSize;
}
int main()
{
LinkQueue<int> lq;
lq.mvPush(1);
lq.mvPop();
system("pause");
return 0;
}