顺序链表实现队列模型(C++模板类)

队列是一种特殊的线性表,而线性表有顺序和链式存储两种,这里只讨论顺序链表实现队列模型,队列遵循的原则是先进先出,因此不管以数组的头部和尾部作为队列的头部,当弹出和压入元素的时候都会设计到队列中元素的移动。这里以数组的头部作为队列的头部。

详细讲解参照https://www.bilibili.com/video/av27904891/?p=1

本次使用工具为vs2017,作者水平有限,若有问题请指出。

队列头文件:Queue_Order_Cplus.h

#pragma once

template<typename T>
class Queue_Order_Cplus
{
public:

	Queue_Order_Cplus(int Capacity);

	//往队列里面压入元素
	int Push_Item(T _item);

	//从队列头部弹出元素
	T Pop_Item();

	//获取队列头元素
	T GetHeadItem();

	//获取队列的元素个数
	int GetItemNum();

	//清空队列
	int ClearQueue();

	~Queue_Order_Cplus();
private:
	T  *Queue_space;;
	int Capacity;
	int QueueLen;
};

队列源文件:Queue_Order_Cplus.cpp

#include "pch.h"
#include "Queue_Order_Cplus.h"
#include "iostream"
using namespace std;

template<typename T>
Queue_Order_Cplus<T>::Queue_Order_Cplus(int Capacity)
{
	this->Queue_space = new T[Capacity];
	if (this->Queue_space == NULL)
	{
		cout << "创建队列失败" << endl;
	}
	else
	{
		this->Capacity = Capacity;
		this->QueueLen = 0;
	}
}

//析构函数销毁队列
template<typename T>
Queue_Order_Cplus<T>::~Queue_Order_Cplus()
{
	if (this->Queue_space != NULL)
	{
		delete[] this->Queue_space;
	}
	this->QueueLen = 0;
	this->Capacity = 0;
}

//往队列里面压入元素
template<typename T>
int Queue_Order_Cplus<T>::Push_Item(T _item)
{
	int ret = 0;
	int queuelen = 0;
	if (this->Queue_space == NULL)
	{
		cout << "Parameters Error :Push_Item() " << endl;
		ret = -1;
		return ret;
	}
	queuelen = GetItemNum();
	if (queuelen < 0)
	{
		cout << "Get queue length error : Push_Item() " << endl;
		ret = -1;
		return ret;
	}
	if (queuelen >= this->Capacity)
	{
		cout << "Queue is full,can't push item :Push_Item()" << endl;
		ret = -1;
		return ret;
	}
	this->Queue_space[queuelen] = _item;  //把地址变成数值压入栈
	this->QueueLen++;
	return ret;
}

//从队列头部弹出元素
template<typename T>
T Queue_Order_Cplus<T>::Pop_Item()
{
	int queuelen = 0;
	T item;
	if (this->Queue_space == NULL)
	{
		cout << "Queue is not created :Pop_Item() " << endl;
		memset(&item, 0, sizeof(T));
		return item;
	}
	queuelen = GetItemNum();
	if (queuelen <= 0)
	{
		cout << "Queue is empty : Pop_Item() " << endl;
		memset(&item, 0, sizeof(T));
		return item;
	}

	this->QueueLen--;
	item = this->Queue_space[0];  //获取队列头部元素,复杂数据类型重载=

	//从右至左移动一个元素
	T temp;
	for (int i = 0; i < queuelen - 1; i++)
	{
		temp = this->Queue_space[i + 1];					 //获取当前内存的后一个元素
		this->Queue_space[i] = temp;
	}
	return item;
}

//获取队列头元素
template<typename T>
T Queue_Order_Cplus<T>::GetHeadItem()
{
	int queuelen = 0;
	T item;
	if (this->Queue_space == NULL)
	{
		memset(&item, 0, sizeof(T));
		cout << "Queue is not created  :GetHeadItem() " << endl;
		return item;
	}

	//数据类型转换
	queuelen = GetItemNum();
	if (queuelen < 0)
	{
		memset(&item, 0, sizeof(T));
		cout << "Get queue length error : GetHeadItem() " << endl;
		return item;
	}
	if (queuelen == 0)
	{
		memset(&item, 0, sizeof(T));
		cout << "Queue is empty,can't get item :GetHeadItem() " << endl;
		return item;
	}
	item = this->Queue_space[0];
	return item;
}

//获取队列的元素个数
template<typename T>
int Queue_Order_Cplus<T>::GetItemNum()
{
	int ret = 0;
	int stacklen = 0;
	if (this->Queue_space == NULL)
	{
		printf("Queue is not created :GetItemNum() \n");
		ret = -1;
		return ret;
	}
	//数据类型转换

	return this->QueueLen;
}

//清空队列
template<typename T>
int Queue_Order_Cplus<T>::ClearQueue()
{
	int ret = 0;
	int stacklen = 0;
	if (this->Queue_space == NULL)
	{
		printf("Queue is not created :ClearQueue() \n");
		ret = -1;
		return ret;
	}
	//数据类型转换
	memset(this->Queue_space, 0, sizeof(this->Queue_space));
	this->QueueLen = 0;
	return ret;
}

队列测试源文件:Queue_Order_Cplus.cpp

#include "pch.h"
#include "Queue_Order_Cplus.cpp"
#include "iostream"
#include "string"
using namespace std;

class person
{
public:
	person()
	{

	}
	person(string name,int age)
	{
		this->name = name;
		this->age = age;
	}
	person(const person &obj)
	{
		this->name = obj.name;
		this->age = obj.age;
	}
	person operator=(person obj)
	{
		this->name = obj.name;
		this->age = obj.age;
		return *this;
	}
	~person()
	{

	}

public:
	string name;
	int    age;
};

//测试int类型的数据
void test_int()
{
	Queue_Order_Cplus<int> QOC(5);
	int a[] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
	int ret = 0;
	int data;
	
	//测试入队列和出队列
	cout << "测试入队列和出队列" << endl;
	ret = QOC.Push_Item(a[0]);
	ret = QOC.Push_Item(a[1]);
	ret = QOC.Push_Item(a[2]);
	ret = QOC.Push_Item(a[3]);
	ret = QOC.Push_Item(a[4]);
	ret = QOC.Push_Item(a[5]);

	cout << endl;
	data = QOC.Pop_Item();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	//测试获取队头元素
	cout << "\n测试获取头部元素\n" << endl;
	ret = QOC.Push_Item(a[7]);
	ret = QOC.Push_Item(a[8]);
	ret = QOC.Push_Item(a[9]);
	ret = QOC.Push_Item(a[10]);
	data = QOC.GetHeadItem();
	cout << data << endl;

	data = QOC.Pop_Item();
	cout << data << endl;

	//测试清除队列
	cout << "\n测试清除队列\n" << endl;
	ret = QOC.ClearQueue();
	ret = QOC.Push_Item(a[11]);
	ret = QOC.Push_Item(a[11]);
	ret = QOC.Push_Item(a[11]);
	data = QOC.Pop_Item();
	cout << data << endl;
}

//测试person类型数据
void test_person()
{
	Queue_Order_Cplus<person> QOC(5);
	person a0("pxzz",70), a1("wxxx", 71), a2("xrjj", 72), a3("aa", 73), a4("bb", 74), a5("cc", 75), a6("dd", 76), a7("ee", 76), a8("ff", 77), a9("gg", 79);
	int ret = 0;
	person data;
	//测试入队列和出队列
	cout << "测试入队列和出队列" << endl;
	ret = QOC.Push_Item(a0);
	ret = QOC.Push_Item(a1);
	ret = QOC.Push_Item(a2);
	ret = QOC.Push_Item(a3);
	ret = QOC.Push_Item(a4);
	ret = QOC.Push_Item(a5);
	cout << endl;
	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	//测试获取队头元素
	cout << "\n测试获取头部元素\n" << endl;
	ret = QOC.Push_Item(a6);
	ret = QOC.Push_Item(a7);
	ret = QOC.Push_Item(a8);
	ret = QOC.Push_Item(a9);
	data = QOC.GetHeadItem();
	cout << data.name << "   " << data.age << endl;

	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

	//测试清除队列
	cout << "\n测试清除队列\n" << endl;
	ret = QOC.ClearQueue();
	ret = QOC.Push_Item(a0);
	ret = QOC.Push_Item(a0);
	ret = QOC.Push_Item(a0);
	data = QOC.Pop_Item();
	cout << data.name << "   " << data.age << endl;

}

int main()
{
	test_int();
	test_person();
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值