QUEUE2
对复杂的数据类型做环形队列:
未做笔记,后期补
demo.cpp
Myqueue中实例化一个custome数组,需要一个默认的构造函数。不需要传参的。所以就在customer.h中加上默认的两个参数值
对于myQueue.cpp只需修改 遍历函数
myQueue.h需要做的改动(部分)
Customer.cpp
队列元素是一个对象
当在堆中实例化对象时,对象当中需要有默认的构造函数(参数有默认值)
#include "Customer.h" class MyQueue{ public: ... bool EnQueue(Customer element); bool DeQueue(Customer &element); ... private: Customer *m_pQueue; ... }; //在MyQueue.cpp中 void MyQueue::QueueTraverse(){ for(int i=m_iHead;i<m_iQueueLen + m_iHead;i++){ m_pQueue[i%m_iQueueCapacity].printInfo(); //printInfo是Customer中的成员函数,打印出Customer的数据成员 } } //使用 MyQueue *p=new MyQueue[4]; Customer c1("zhangsan",20); p->EnQueue(c1);
/********************************
******** 环形队列 *******
*********************************/
#ifndef MYQUEUE_H_
#define MYQUEUE_H_
#include <iostream>
using namespace std;
const int DefaultCapacitySize = 20;
template <typename T>
class MyQueue
{
public:
MyQueue();
~MyQueue();
bool ClearQueue() ; // 清空队列
bool IsEmpty() ; // 判断队列是否为空
bool IsFull(); // 判断队列是否为满
int QueueLen(); // 返回队列长度
bool InsertQueue(const T elem); // 插入元素
bool DeleteQueue(T & elem); // 删除元素
bool TraverseQueue() ; // 遍历队列
private:
T * m_data; // 存放数据
int iHead; // 指向队列头部
int iTail; // 指向队列尾部
int m_capacity; // 队列容量
int m_length; // 队列长度
};
// 构造函数
template <typename T>
MyQueue<T>::MyQueue()
{
m_data = new T [DefaultCapacitySize];
iHead = 0;
iTail = 0;
m_capacity = DefaultCapacitySize;
m_length = 0;
}
// 析构函数
template <typename T>
MyQueue<T>::~MyQueue()
{
delete [] m_data;
m_data = NULL;
}
// 清空队列
template <typename T>
bool MyQueue<T>::ClearQueue()
{
m_length = 0;
iHead = 0;
iTail = 0;
return true;
}
// 判断队列是否为空
template <typename T>
bool MyQueue<T>::IsEmpty()
{
return (m_length == 0) ? true : false;
}
// 判断队列是否为满
template <typename T>
bool MyQueue<T>::IsFull()
{
return (m_length == m_capacity) ? true : false;
}
// 返回队列长度
template <typename T>
int MyQueue<T>::QueueLen()
{
return m_length;
}
// 插入元素
template <typename T>
bool MyQueue<T>::InsertQueue(const T elem)
{
if (IsFull())
return false;
m_data[iTail] = elem;
iTail++;
iTail %= m_capacity;
m_length++;
return true;
}
// 删除元素
template <typename T>
bool MyQueue<T>::DeleteQueue(T & elem)
{
if (IsEmpty())
return false;
elem = m_data[iHead];
iHead++;
iHead %= m_capacity;
m_length--;
return true;
}
// 遍历队列
template <typename T>
bool MyQueue<T>::TraverseQueue()
{
if (IsEmpty())
return false;
for (int i = iHead; i < m_length + iHead; i++)
{
cout << m_data[i % m_capacity] << " ";
}
cout << endl;
return true;
}
#endif