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