目录

与C版本相比改进的地方

准备部分

构造函数&&析构函数

入队列(push)

出队列(pop)

取队头元素&&取队尾元素&&展示所以元素

类的声明加定义

实际使用

运行示例


与C版本相比改进的地方

C++中同一个类中函数调用成员变量不用一次次的传参,直接使用成员名就行(这里面还是有一个隐藏的this的)

C++中可以直接写好构造函数和析构函数,就不用想C一样每次创建一个队列就初始化一次,在使用结束时也可以通过析构函数直接销毁,直接省了好多步骤

C++中创建的类的实例可以做到操作时互不干扰

其实还有优化空间,我写的时候每个函数中的判空都是再写一遍的,其实另外写一个判空函数更好

准备部分

struct QTNode//基本节点
{
	TypeNode _val;
	struct QTNode* next;
};
class QT
{
//...........
private:
	QTNode* _head;
	QTNode* _tail;
	int _size;
};

这里是队列的成员变量声明

构造函数&&析构函数

QT()//构造函数
	{
		_head = nullptr;
		_tail = nullptr;
		_size = 0;
	}
	~QT()//析构函数
	{
		QTNode* cur = _head;
		QTNode* next = nullptr;
		while (cur)
		{
			next = cur->next;
			free(cur);
			cur = next;
		}
	}

入队列(push)

入队列就是很经典的链表动态申请和链表的连接

void QTpush(TypeNode val)//入队列
	{
		QTNode* NewNode = (QTNode*)malloc(sizeof(QTNode));
		if (nullptr == NewNode)
		{
			perror("malloc");
			return;
		}
		NewNode->next = nullptr;
		NewNode->_val = val;
		if (nullptr == _head && nullptr == _tail)
		{
			_head = _tail = NewNode;
			_head->next = nullptr;
			_tail->next = nullptr;
		}
		else
		{
			_tail->next = NewNode;
			_tail = NewNode;
			_tail->next = nullptr;
		}
		_size++;
	}

出队列(pop)

TypeNode QTpop()//出队列
	{
		if (nullptr == _tail && nullptr==_head)
		{
			std::cout << "当前队列中没有数据" << std::endl;
			return -1;
		}
		else
		{
			TypeNode ret;
			if (nullptr == _tail)
			{
				std::cout << "当前队列中没有数据" << std::endl;
				return -1;
			}
			else if (_head == _tail)
			{
				ret = _head->_val;
				free(_head);
				_head = _tail = nullptr;
			}
			else
			{
				ret = _tail->_val;
				QTNode* cur = _head;
				while (cur->next != _tail)
				{
					cur = cur->next;
				}
				free(_tail);
				_tail = nullptr;
				_tail = cur;
				_tail->next = nullptr;//注意这里,不将_tail->next置空后续会越界访问
			}
			_size--;
			return ret;
		}	
	}

注意在将_tail指向的元素置空并指向上一个元素时应该将上一个的next置空,防止越界访问。

如果没有这一步的话,_tail指针在挪向上一个位置时它的next仍然指向已经被释放的空间,此时就会......

what can i say

就会坠机

取队头元素&&取队尾元素&&展示所以元素

TypeNode QTtail()//取头元素
{
	TypeNode ret;
	if (nullptr == _tail && nullptr == _head && _size == 0)
	{
		std::cout << "当前队列中没有数据" << std::endl;
		return -1;
	}
	else
	{
		if (nullptr == _tail)
		{
			ret = -1;
		}
		else
		{
			ret = _tail->_val;
		}
	}
	return ret;
}
TypeNode QTfront()//取尾元素
{
	TypeNode ret;
	if (nullptr == _tail && nullptr == _head && 0 == _size)
	{
		std::cout << "当前队列中没有数据" << std::endl;
		return -1;
	}
	else
	{
		if (nullptr == _head)
		{
			ret = -1;
		}
		else
		{
			ret = _head->_val;
		}
	}
	return ret;
}
void QTdisplay()//展示全部节点数据
{
	if (nullptr == _head && nullptr == _tail)
	{
		std::cout << "当前队列中没有数据" << std::endl;
		return;
	}
	else
	{
		QTNode* cur = _head;
		while (cur)
		{
			std::cout << cur->_val << "  ";
			cur = cur->next;
		}
		std::cout << std::endl;
	}
}

类的声明加定义

#pragma once
#include<iostream>
typedef int TypeNode;

struct QTNode//基本节点
{
	TypeNode _val;
	struct QTNode* next;
};

class QT
{
public:
	QT()//构造函数
	{
		_head = nullptr;
		_tail = nullptr;
		_size = 0;
	}
	~QT()//析构函数
	{
		QTNode* cur = _head;
		QTNode* next = nullptr;
		while (cur)
		{
			next = cur->next;
			free(cur);
			cur = next;
		}
	}
	void QTpush(TypeNode val)//入队列
	{
		QTNode* NewNode = (QTNode*)malloc(sizeof(QTNode));
		if (nullptr == NewNode)
		{
			perror("malloc");
			return;
		}
		NewNode->next = nullptr;
		NewNode->_val = val;
		if (nullptr == _head && nullptr == _tail)
		{
			_head = _tail = NewNode;
			_head->next = nullptr;
			_tail->next = nullptr;
		}
		else
		{
			_tail->next = NewNode;
			_tail = NewNode;
			_tail->next = nullptr;
		}
		_size++;
	}
	TypeNode QTpop()//出队列
	{
		if (nullptr == _tail && nullptr==_head)
		{
			std::cout << "当前队列中没有数据" << std::endl;
			return -1;
		}
		else
		{
			TypeNode ret;
			if (nullptr == _tail)
			{
				std::cout << "当前队列中没有数据" << std::endl;
				return -1;
			}
			else if (_head == _tail)
			{
				ret = _head->_val;
				free(_head);
				_head = _tail = nullptr;
			}
			else
			{
				ret = _tail->_val;
				QTNode* cur = _head;
				while (cur->next != _tail)
				{
					cur = cur->next;
				}
				free(_tail);
				_tail = nullptr;
				_tail = cur;
				_tail->next = nullptr;
			}
			_size--;
			return ret;
		}	
	}
	TypeNode QTtail()//取头元素
	{
		TypeNode ret;
		if (nullptr == _tail && nullptr == _head && _size == 0)
		{
			std::cout << "当前队列中没有数据" << std::endl;
			return -1;
		}
		else
		{
			if (nullptr == _tail)
			{
				ret = -1;
			}
			else
			{
				ret = _tail->_val;
			}
		}
		return ret;
	}
	TypeNode QTfront()//取尾元素
	{
		TypeNode ret;
		if (nullptr == _tail && nullptr == _head && 0 == _size)
		{
			std::cout << "当前队列中没有数据" << std::endl;
			return -1;
		}
		else
		{
			if (nullptr == _head)
			{
				ret = -1;
			}
			else
			{
				ret = _head->_val;
			}
		}
		return ret;
	}
	void QTdisplay()//展示全部节点数据
	{
		if (nullptr == _head && nullptr == _tail)
		{
			std::cout << "当前队列中没有数据" << std::endl;
			return;
		}
		else
		{
			QTNode* cur = _head;
			while (cur)
			{
				std::cout << cur->_val << "  ";
				cur = cur->next;
			}
			std::cout << std::endl;
		}
	}
private:
	QTNode* _head;
	QTNode* _tail;
	int _size;
};

实际使用

#include"QT.h"

int main()
{
	QT qt1;
	qt1.QTpush(1);
	qt1.QTpush(2);
	qt1.QTpush(3);
	qt1.QTpush(4);
	qt1.QTpush(5);
	qt1.QTpush(6);
	qt1.QTdisplay();
	std::cout << qt1.QTpop() << std::endl;
	std::cout << qt1.QTtail() << std::endl;
	std::cout << qt1.QTfront() << std::endl;
	qt1.QTdisplay();
	return 0;
}

运行示例

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐