数据结构和算法--链队列(C++实现)

队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已,简称链队列。

#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值