讲在前面:
在实现该队列的代码是遇到两个问题
1.在声明重载Customer的构造函数时,要对构造函数中的参数初始化,不然会报没有合适的默认构造函数可用
2.在实现模板函数时,模板函数的声明和定义需放在同一个文件中,如下:MyQueue.h
/**************************
******Customer.h***********
***************************/
#pragma once
#include<string>
#include<iostream>
using namespace std;
class Customer
{
public:
Customer(string Name="Tom", int Age=1);//重载构造函数要对形参进行初始化,不然在对Customer进行实例化时会报错:不存在默认构造函数
friend ostream & operator<<(ostream &os, const Customer &customer);//重载输出符使得可以打印Customer的信息
//void printInfo()const;
private:
string m_sName;
int m_iAge;
};
/**************************
******Customer.cpp***********
***************************/
#include "Customer.h"
Customer::Customer(string Name, int Age)
{
m_sName = Name;
m_iAge = Age;
}
//void Customer::printInfo() const
//{
// cout<<"姓名:"<<m_sName<<endl;
// cout<<"年龄:" << m_iAge << endl;
// cout << endl;
//}
ostream & operator <<(ostream &os, const Customer &customer)
{
os << "name:" << customer.m_sName << endl;
os << "age:" << customer.m_iAge << endl;
return os;
}
/**************************
******MyQueue.h***********
***************************/
#pragma once
/*环形队列C++的实现*/
#include"stdio.h"
#include"Customer.h"
template<typename T>
class MyQueue
{
public:
MyQueue(int queueCapacity); //InitQueue(&Q)创建队列
virtual~MyQueue(); //DestoryQueue(&Q)销毁队列
void ClearQueue(); //ClearQueue(&Q) 清空队列
bool QueueEmpty() const; //QueueEmpty(Q)判空队列
bool QueueFull() const; //QueueFull(Q)判满队列
int QueueLength()const; //QueueLength(Q)队列长度
//bool EnQueue(int element); //EnQueue(&Q element)新元素入队
bool EnQueue(T element);
//bool DeQueue(int &element); //DeQueue(&Q &element)新元素出队
bool DeQueue(T &element);
void QueueTraverse(); //QueueTraverse(Q,visit())遍历队列
private:
//int *m_pQueue; //队列数组指针
T *m_pQueue;
int m_iQueueLen; //队列元素个数
int m_iQueueCapacity; //队列数组容量
int m_iHead;
int m_iTail;
};
template<typename T>
MyQueue<T>::MyQueue(int queueCapacity) //InitQueue(&Q)创建队列
{
m_iQueueCapacity = queueCapacity;
m_pQueue = new T[m_iQueueCapacity];
ClearQueue();
}
template<typename T>
MyQueue<T>::~MyQueue() //DestoryQueue(&Q)销毁队列
{
delete[]m_pQueue;
m_pQueue = NULL;
}
template<typename T>
void MyQueue<T>::ClearQueue() //ClearQueue(&Q) 清空队列
{
m_iHead = 0;
m_iTail = 0;
m_iQueueLen = 0;
}
template<typename T>
bool MyQueue<T>::QueueEmpty()const //QueueEmpty(Q)判空队列
{
if (m_iQueueLen == 0)
{
return true;
}
else
return false;
//return m_iQueueLen==0?true:false;
}
template<typename T>
int MyQueue<T>::QueueLength()const //QueueLength(Q)队列长度
{
return m_iQueueLen;
}
template<typename T>
bool MyQueue<T>::QueueFull() const
{
if (m_iQueueLen == m_iQueueCapacity)
{
return true;
}
else
return false;
}
template<typename T>
bool MyQueue<T>::EnQueue(T element) //EnQueue(&Q element)新元素入队
{
if (QueueFull())
{
return false;
}
else
{
m_pQueue[m_iTail] = element;
m_iTail++;
m_iTail = m_iTail % m_iQueueCapacity;
m_iQueueLen++;
return true;
}
}
template<typename T>
bool MyQueue<T>::DeQueue(T&element) //DeQueue(&Q &element)新元素出队
{
if (QueueEmpty())
{
return false;
}
element = m_pQueue[m_iHead];
m_iHead++;
m_iHead = m_iHead % m_iQueueCapacity;
m_iQueueLen--;
return true;
}
template<typename T>
void MyQueue<T>::QueueTraverse() //QueueTraverse(Q,visit())遍历队列
{
for (int i = m_iHead; i < m_iQueueLen + m_iHead; i++)
{
cout << m_pQueue[i%m_iQueueCapacity] << endl;
}
cout << endl;
}
/**************************
******demo.cpp***********
***************************/
#include <iostream>
#include<stdlib.h>
#include"MyQuence.h"
#include"Customer.h"
using namespace std;
/***********************
********实现环形*******
***********************/
int main(void)
{
MyQueue<Customer> *p = new MyQueue<Customer>(4);
Customer c1("zhangsan",20);
Customer c2("lisi", 16);
Customer c3("wangwu", 21);
Customer c4("zhaoqian", 22);
p->EnQueue(c1);
p->EnQueue(c2);
p->EnQueue(c3);
p->EnQueue(c4);
p->QueueTraverse();
cout << "删除" << endl;
Customer e;
p->DeQueue(e);
cout<<"遍历"<<endl;
p->QueueTraverse();
/*MyQueue<char> *p = new MyQueue<char>(4);
p->EnQueue('a');
p->EnQueue('b');
p->EnQueue('c');
p->EnQueue('d');
p->QueueTraverse();
char e;
p->DeQueue(e);
cout<<"删除后的遍历"<<endl;
p->QueueTraverse();
*/
system("pause");
return 0;
}