队列符合先进先出的原则,循环队列可以持续地往队列里增加元素、减少元素。
以下为例。
MyQueue.h
#ifndef MYQUEUE_H
#define MYQUEUE_H
#include"Customer.h"
#include"MyQueue.h"
#include<iostream>
using namespace std;
template <typename T>//用类模板
class MyQueue
{
public:
MyQueue(int QueueCapacity);
virtual ~MyQueue();
void ClearQueue();
bool QueueEmpty()const;
bool QueueFull()const;
int QueueLength()const;
bool EnQueue(T element);
bool DeQueue(T &element);
void QueueTraverse();
private:
T * m_pQueue;//队列里的每个元素都是一个类的对象
int m_iQueueLen;
int m_iQueueCapacity;
int m_iHead,m_iTail;//队头队尾的脚标
};
template <typename T>
MyQueue<T>::MyQueue(int QueueCapacity)
{
m_iQueueCapacity = QueueCapacity;
m_pQueue = new T[m_iQueueCapacity];
ClearQueue();//直接调用
cout << "MyQueue(int QueueCapacity)" << endl;
}
template <typename T>
MyQueue<T>::~MyQueue()
{
delete []m_pQueue;
m_pQueue = NULL;
cout << "~MyQueue()" << endl;
}
template <typename T>
void MyQueue<T>::ClearQueue()
{
m_iQueueLen = 0;
m_iHead = m_iTail = 0;
}
template <typename T>
bool MyQueue<T>::QueueEmpty()const
{
if(m_iQueueLen == 0){
return true;
}else{
return false;
}
//return m_iQueueLen == 0?true:false;
}
template <typename T>
bool MyQueue<T>::QueueFull()const
{
return m_iQueueLen == m_iQueueCapacity ? true : false;
}
template <typename T>
int MyQueue<T>::QueueLength()const
{
return m_iQueueLen;
}
template <typename T>
bool MyQueue<T>::EnQueue(T element)
{
if(QueueFull()){
return false;
}else{
m_pQueue[m_iTail] = element;
m_iTail = (m_iTail + 1)%m_iQueueCapacity;
m_iQueueLen++;
return true;
}
}
template <typename T>
bool MyQueue<T>::DeQueue(T &element)//element用于接收出队的元素
{
if(QueueEmpty()){
return false;
}else{
element = m_pQueue[m_iHead];
m_iHead = (m_iHead + 1)%m_iQueueCapacity;
m_iQueueLen--;
return true;
}
}
template <typename T>
void MyQueue<T>::QueueTraverse()
{//类模板不允许对不同T的不同操作,所以如果要对int类型也实现.printInfo是没有办法的,因为int没有该成员函数,能做的就是自己定义一个自己的int类myInt,然后定义成员函数printInfo,这样就能和customer统一代码了
//cout << endl;
//if(typeid(T) == typeid(Customer)){
// for(int i = 0;i < m_iQueueLen;i++){
// //cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << ",";
// m_pQueue[(i+m_iHead)%m_iQueueCapacity].printInfo();
// cout << "前面还有" << i << "个元素" << endl;
// }
// cout << endl;
//}
//if(typeid(T)== typeid(int)){
// for(int i = 0;i < m_iQueueLen;i++){
// cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << ",";
// cout << "前面还有" << i << "个元素" << endl;
// }
// cout << endl;
//}
//可以改用运算符重载
for(int i = 0;i < m_iQueueLen;i++){
cout << m_pQueue[(i+m_iHead)%m_iQueueCapacity] << endl;
cout << "前面还有" << i << "个元素" << endl;
}
cout << endl;
}
#endif
//没有MyQueue.cpp,在vs2012版本中,模板类的声明和定义必须都放在.h里面才能编译成功。
Customer.h
#ifndef CUSTOMER_H
#define CUSTOMER_H
#include<string>
using namespace std;
class Customer
{
friend ostream& operator <<(ostream&,Customer&);
public:
Customer(string name = "",int age = 0);
void printInfo()const;
private:
string m_strName;
int m_iAge;
};
#endif
#include"Customer.h"
#include<iostream>
using namespace std;
Customer::Customer(string name,int age):m_strName(name),m_iAge(age)
{
cout << "Customer(string name,int age)" << endl;
}
void Customer::printInfo()const
{
cout << "姓名:" << m_strName << endl;
cout << "年龄:" << m_iAge << endl;
cout << endl;
}
demo.cpp
#include"MyQueue.h"
#include<iostream>
#include<stdlib.h>
using namespace std;
ostream& operator <<(ostream&,Customer&);//友元全局函数
//环形队列
int main()
{
MyQueue<Customer> *p = new MyQueue<Customer>(4);//初值赋4,表示4个元素。
Customer c1("zxb",21),c2("zxz",21),c3("zxv",21),c4("zxj",21),c5("zx",21);
p->EnQueue(c1);
p->EnQueue(c2);
p->EnQueue(c3);
p->EnQueue(c4);
p->EnQueue(c5);//已满,c5进不去
p->QueueTraverse();
cout << p->QueueEmpty() << p->QueueFull() << p->QueueLength() << endl;
Customer test;
p->DeQueue(test);
test.printInfo();
p->QueueTraverse();
p->ClearQueue();
cout << p->QueueLength() << endl;
MyQueue<int> *p1 = new MyQueue<int>(4);
p1->EnQueue(10);
p1->EnQueue(7);
p1->EnQueue(3);
p1->EnQueue(1);
p1->EnQueue(2);//队列已满,这个2无法成功添加
p1->QueueTraverse();
cout << p1->QueueEmpty() << p1->QueueFull() << p1->QueueLength() << endl;
int test1;
p1->DeQueue(test1);
cout << test1 << endl << p1->QueueLength() << endl;
p1->QueueTraverse();
p1->DeQueue(test1);
cout << test1 << endl << p1->QueueLength() << endl;
p1->QueueTraverse();
p1->ClearQueue();
cout << p1->QueueEmpty() << endl;
delete p;
delete p1;
system("pause");
return 0;
}
ostream& operator <<(ostream& out,Customer& cos)
{
out << "姓名:" << cos.m_strName << endl;
out << "年龄:" << cos.m_iAge;
return out;
}
运行结果: