【C++/数据结构】队列

零.导言

和上次学习的栈一样,队列是一种数据结构,在后续的学习中可能经常使用,因此我们今天就来学习如何实现队列,以更好地使用它。


一.队列的模拟实现

在类(class)Queue 中,包含成员变量和成员函数;同时,队列的实现要相对复杂一些。

我们先看代码:

cpp 复制代码
#include<iostream>
#include<cassert>

using namespace std;

typedef int QueueDataType;

class Queue
{
public:
	Queue()
	{
		_phead = _ptail = nullptr;
		_size = 0;
	}

	~Queue()
	{
		QueueNode* pcur = _phead;
		while (pcur)
		{
			QueueNode* next = pcur->_next;
			free(pcur);
			pcur = next;
		}
		_phead = _ptail = nullptr;
		_size = 0;
	}

	void Push(QueueDataType n)
	{
		QueueNode* newnode = (QueueNode*)malloc(sizeof(QueueNode));
		if (newnode == nullptr)
		{
			perror("malloc fail!");
			exit(1);
		}
		newnode->_val = n;
		newnode->_next = nullptr;
		if (_phead == nullptr)
		{
			_phead = _ptail = newnode;
		}
		else
		{
			_ptail->_next = newnode;
			_ptail = _ptail->_next;
		}
		_size++;
	}

	bool isEmpty()
	{
		return _phead == nullptr;
	}

	void Pop()
	{
		assert(!isEmpty());
		if (_phead == _ptail)
		{
			free(_phead);
			_phead = _ptail = nullptr;
		}
		else
		{
			QueueNode* next = _phead->_next;
			free(_phead);
			_phead = next;
		}
		_size--;
	}

	QueueDataType Front()
	{
		assert(!isEmpty());
		return _phead->_val;
	}

	QueueDataType Back()
	{
		assert(!isEmpty());
		return _ptail->_val;
	}

	int Size()
	{
		return _size;
	}

private:
	class QueueNode
	{
		friend class Queue;
		QueueDataType _val;
		QueueNode* _next;
	};

	QueueNode* _phead;
	QueueNode* _ptail;
	int _size;
};

二.队列的相关解释

如上:队列的实现需要定义两个结构体,第一是 QueueNode ,是链表的节点类型;第二是 Queue ,指向队列的头和尾。

其中:构造函数和析构函数很容易辨认,Push 是向队尾插入数据,Pop 是从队头出数据,Front 是取队头数据,Back 是取队尾数据,Size 是返回有效元素个数。


三.队列的特性

队列的特性是:所有数据都只能从队尾入,从队头出。和堆的形式相反,先进先出。运用这个特性,我们可以便捷的解决堆不好解决的问题。


四.相关链接

【C++/数据结构】栈-CSDN博客


相关推荐
程序喵大人18 小时前
手写智能指针:带你彻底搞懂 C++ 内存管理的底层逻辑
开发语言·c++·内存管理·智能指针
草莓熊Lotso18 小时前
【C++】详解形参和实参:别再傻傻分不清
c语言·开发语言·c++·经验分享·笔记·其他
百度森森19 小时前
【nuscenes数据集有关】
c++·数码相机·学习·ubuntu
翻滚丷大头鱼19 小时前
android View详解—自定义ViewGroup,流式布局
android·数据结构
吗喽对你问好19 小时前
Java场景题面试合集
java·开发语言·面试
MT_12519 小时前
大小端存储的理解与判断方法
数据结构·算法
一眼万里*e19 小时前
用ai写了个UE5插件
c++·ue5
He19550119 小时前
Go初级之九:Select 与并发控制
开发语言·后端·golang
R-G-B19 小时前
【75】OpenCV C++实战篇——OpenCV 图像拼接、全景拼接(教程合集)
c++·人工智能·opencv·图像拼接·opencv 图像拼接·opencv 图像全景拼接·图像全景拼接
玩镜的码农小师兄19 小时前
[从零开始面试算法] (11/100) LeetCode 226. 反转二叉树:递归的“镜像”魔法
c++·算法·leetcode·面试·递归·hot100